【发布时间】:2019-01-12 00:30:21
【问题描述】:
我有一个应用程序 (IJobInit),它使用 JSON 设置中的列表来创建类的多个实例 (IJob)。这个类使用另外两个依赖项IInputClient 和IOutputClient 来完成一些工作。它使用 M.Extensions.DependencyInjection 创建一个容器,然后交给 AutoFac 创建一个 IContainer。
IJobInit(IContainer container)
我希望为每个 IJob 实例配置不同的 IInputClient。特别是,我想传递一个秘密供它使用。结果是:
IInputClient(HttpClient client)
其中 HttpClient 是使用 ConfigureHttpClient 配置的,因此 IJob 不知道它已经过预身份验证。这也很合适:
IInputClient(ISecretProvider secretsProvider, string secretName)
最终结果是三个 IJob 实例,IInputClient 配置不同。
IJob(IInputClient inputClient1, IOutputClient outputClient)
IJob(IInputClient inputClient2, IOutputClient outputClient)
IJob(IInputClient inputClient3, IOutputClient outputClient)
我如何实现这一目标?我正在查看 Autofac 范围,但这些控制何时创建实例而对其配置没有任何控制(除非我错过了它)。
一位同事建议我可以使用自己的配置在其自己的进程中托管每个 IJob 实例,这是可能的,但我试图在单个 Azure 函数中托管所有作业并使用在配置中列出以创建内部作业。
谢谢!
【问题讨论】:
-
听起来你已经反转了导致问题的控制。如果您有一个可枚举的配置,那么根据配置的数量创建您的可枚举
IJobInit/IJob。 Autofac 支持Enumerated relationships implicitly。 -
另外看起来你有多个容器......这些类型的配置真的很少见,我不明白为什么你的实现需要这样做。在第二次检查时,您可能需要为您的
IInputClient创建另一个抽象层,将HttpClient替换为一个知道秘密实现的对象,尽管您可以使用 pre-configuring named instances 但我不确定这是否能满足您的需求. -
我喜欢列举的关系。我想我也可以使用 Autofac 的提供程序以编程方式注册它们。
标签: c# .net-core azure-functions autofac