1

我正在编写一个供内部使用的库。这个库的目的是抽象出对一些内部 REST API 的调用。在后台,我使用 Flurl 来提出请求。该库还提供扩展方法来设置 DI(Core Web)以轻松地将所有内容连接在一起(services.AddXYIntegration())。在 flurl 的情况下,我的库提供了DefaultHttpClientFactory(inherits from 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...
}

因此,库不是注入X509HttpClientFactoryfor ,而是IHttpClientFactory IX509HttpClientFactory. IHttpClientFactory 仍然“可用于”注射。

我的问题不是针对 flurl 的,而是针对类似情况的一般性问题。

这是一个好的设计吗?您如何处理具有可配置的 3rd 方依赖项的这种情况?违反 CA1040 是否可行。

4

1 回答 1

1

因此,库不是注入X509HttpClientFactoryfor ,而是IHttpClientFactoryIX509HttpClientFactory.

如果我对您的理解正确,那么是的,我认为这是要走的路。DI 是一个应用程序级别的概念,尽管我们习惯于使用它来实例化大多数东西,但它仍然完全适合在new库内部建立依赖关系以保持该库的良好封装。我什至不会公开曝光IX509HttpClientFactory,除非有必要我没有看到。

于 2020-08-03T14:07:15.883 回答