Пишу библиотеку для внутреннего пользования. Цель этой библиотеки - абстрагироваться от вызовов некоторых внутренних REST API. Под капотом я использую Flurl для выполнения запросов. Библиотека также предоставляет методы расширений, которые настраивают DI (Core Web), чтобы легко связать все вместе (services.AddXYIntegration()
). В случае flurl моя библиотека предоставляет реализацию DefaultHttpClientFactory
(наследуется от IHttpClientFactory
) => X509ClientFactory
. Чтобы избежать коллизии или перезаписи DI приложений, использующих мою библиотеку, которые, вероятно, также используют Flurl для запросов https и хотят предоставить настраиваемую реализацию для IHttpClientFactory
, я создал пустой интерфейс, просто чтобы «пометить» реализацию моих библиотек и использовать его в Проводка DI.
Немного битового кода:
public interface IX509HttpClientFactory : IHttpClientFactory
{
// empty interface, violates CA1040
}
public class X509HttpClientFactory : DefaultHttpClientFactory /* inherits from IHttpClientFactory */, IX509HttpClientFactory
{
// Implementation details...
}
Таким образом, вместо того, чтобы вводить X509HttpClientFactory
для IHttpClientFactory
, библиотека создает экземпляр для IX509HttpClientFactory
. IHttpClientFactory
все еще "доступен" для инъекций.
Мой вопрос не относится к flurl, это более общий вопрос для подобных сценариев.
Это хороший дизайн? Как вы справляетесь с такими случаями, когда у вас есть настраиваемые зависимости сторонних производителей? Возможен ли сценарий нарушения CA1040.
1 ответ
Итак, вместо того, чтобы вводить
X509HttpClientFactory
дляIHttpClientFactory
, библиотека создает экземпляр дляIX509HttpClientFactory
.
Если я правильно вас понимаю, то да, я думаю, это правильный путь. DI - это концепция уровня приложения, и хотя мы привыкли использовать ее для создания экземпляров большинства вещей, все же вполне уместно new
создавать внутренние зависимости библиотеки, чтобы эта библиотека была хорошо инкапсулирована. Я бы даже не стал раскрывать IX509HttpClientFactory
публично, если в этом нет необходимости.
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.