C# 使用Autofac解析上下文驱动的参数

C# 使用Autofac解析上下文驱动的参数,c#,.net,dependency-injection,autofac,C#,.net,Dependency Injection,Autofac,我正试图找到一种更好的方法来使用Autofac解析上下文驱动的参数。考虑下面的代码: builder.RegisterType().WithParameter(“connectionStringKey”、“MyConnectionStringKey”).As(); builder.RegisterType().As().PropertiesAutowired(); builder.RegisterType().As().PropertiesAutowired(); builder.Registe

我正试图找到一种更好的方法来使用Autofac解析上下文驱动的参数。考虑下面的代码:

builder.RegisterType().WithParameter(“connectionStringKey”、“MyConnectionStringKey”).As();
builder.RegisterType().As().PropertiesAutowired();
builder.RegisterType().As().PropertiesAutowired();
builder.RegisterType().As().PropertiesAutowired();
builder.RegisterType().As().PropertiesAutowired();
在本例中,每个“存储库”都有一个属性ResourceFactory,类型为DatabaseResourceFactory,该属性具有本地默认值(与遗留代码兼容)。只要所有需要ResourceFactory注入的类型都使用相同的连接字符串,这种方法就非常有效

但是,如果C和D存储库需要不同的连接字符串,这个解决方案将不再有效。我能想到的最好的解决方法是使用如下内容

builder.RegisterType()
.As()
.OnActivating(c=>c.Instance.ResourceFactory=new-SqlDatabaseResourceFactory(“MyConnectionStringKey”);
但现在需要为每个注册的存储库类型执行此操作,这似乎过于重复和笨拙。这类问题有没有更好的解决办法。这个问题是否表明存在某种潜在的体系结构问题

如果C和D存储库需要不同的连接字符串

如果C和D需要不同的连接,它们应该有自己的抽象。例如,定义一个
IBillingDatabaseResourceFactory
IShippingDatabaseResourceFactory
。这解决了当前设计和DI配置中的模糊性。

您可以使用:

 builder.Register(c => new CTypeRepository(new SqlDatabaseResourceFactory("C-connectionstring")).As<ICTypeRepository>().PropertiesAutowired();
builder.Register(c=>new-CTypeRepository(new-SqlDatabaseResourceFactory(“c-connectionstring”)).As().PropertiesAutowired();

虽然这可以很好地解决依赖项解决问题,但我似乎只是为了区分使用DatabaseResourceFactory的不同上下文(即,不同的连接字符串),而创建了许多贫乏的接口.我不确定将通用DatabaseResourceFactory(及其特定于实现的子项,即SqlDatabaseResourceFactory)耦合起来是否有意义到特定于一个应用程序域的接口。这也可以,但它似乎与我在原始问题中指出的OnActivating解决方案存在相同的问题。我是否仍然需要为需要存储库的每种类型单独注册连接字符串?我希望找到一个解决方案,在那里可以消除此redundancy并以某种方式指定每组项目的连接字符串。如果可以为每个不同的实例指定多个连接字符串,则无法避免以某种方式指定映射。想想看,每次实例化时,都必须指定哪一个。可以直接提供,也可以通过接口,或者可能是通过如其他人所建议的那样。