具有第 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
除非有必要,我没有看到。
我正在编写供内部使用的库。这个库的目的是抽象掉对一些内部 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
forIHttpClientFactory
, the library creates the instance forIX509HttpClientFactory
.
如果我对你的理解是正确的,那么是的,我认为这是要走的路。 DI 是一个 application-level 概念,虽然我们习惯于使用它来实例化大多数东西,但它仍然完全适合 new
建立库内部的依赖关系,以保持该库的良好封装。我什至不会公开 IX509HttpClientFactory
除非有必要,我没有看到。