具有第 3 方依赖项的库设计和 DI

Library design and DI with 3rd party dependencies

我正在编写供内部使用的库。这个库的目的是抽象掉对一些内部 REST API 的调用。在幕后,我正在使用 Flurl 来发出请求。该库还提供了设置 DI(核心 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...
}

因此,库不会为 IHttpClientFactory 注入 X509HttpClientFactory,而是为 IX509HttpClientFactory 创建实例。 IHttpClientFactory 仍然“可以”进行注射。

我的问题不是针对 flurl 的,它更像是针对类似场景的一般问题。

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

So, instead of injecting X509HttpClientFactory for IHttpClientFactory, the library creates the instance for IX509HttpClientFactory.

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