我试图找到一种更好的方法来使用 Autofac 解决上下文驱动的参数。考虑以下代码:
builder.RegisterType<SqlDatabaseResourceFactory>().WithParameter("connectionStringKey", "MyConnectionStringKey").As<DatabaseResourceFactory>();
builder.RegisterType<ATypeRepository>().As<IATypeRepository>().PropertiesAutowired();
builder.RegisterType<BTypeRepository>().As<IBTypeRepository>().PropertiesAutowired();
builder.RegisterType<CTypeRepository>().As<ICTypeRepository>().PropertiesAutowired();
builder.RegisterType<DTypeRepository>().As<IDTypeRepository>().PropertiesAutowired();
在这种情况下,每个“存储库”都有一个属性 ResourceFactory,类型为 DatabaseResourceFactory,它具有本地默认值(为了与遗留代码兼容)。只要需要注入 ResourceFactory 的所有类型都使用相同的连接字符串,这将非常有效。
但是,如果 C 和 D 存储库需要不同的连接字符串,则此解决方案将不再有效。我能想到的最好的解决方法是使用类似下面的东西
builder.RegisterType<ATypeRepository>()
.As<IATypeRepository>()
.OnActivating(c => c.Instance.ResourceFactory = new SqlDatabaseResourceFactory("MyConnectionStringKey"));
但是现在需要为注册的每个存储库类型执行此操作,这似乎过于重复和笨拙。这类问题有没有更好的解决方案。这个问题是否表明某些潜在的架构问题?