[英]Library design and DI with 3rd party dependencies
我正在编写一个供内部使用的库。 这个库的目的是抽象出对一些内部 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...
}
因此,库不是为IHttpClientFactory
注入X509HttpClientFactory
,而是为IX509HttpClientFactory
创建实例。 IHttpClientFactory
仍然“可用于”注入。
我的问题不是针对 flurl 的,而是针对类似情况的一般性问题。
这是一个好的设计吗? 您如何处理具有可配置的 3rd 方依赖项的这种情况? 违反 CA1040 是否可行。
因此,库不是为
IHttpClientFactory
注入X509HttpClientFactory
,而是为IX509HttpClientFactory
创建实例。
如果我对您的理解正确,那么是的,我认为这是通往 go 的方式。 DI 是一个应用程序级别的概念,尽管我们习惯于使用它来实例化大多数事物,但它仍然完全适合在库内部new
依赖项以保持该库的良好封装。 我什至不会公开公开IX509HttpClientFactory
除非有我没有看到的需要。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.