我正在尝试使用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();
在这种情况下,每个“Repository”都有一个属性ResourceFactory,类型为DatabaseResourceFactory,它具有本地默认值(为了与遗留代码兼容)。只要注入了需要ResourceFactory的所有类型使用相同的连接字符串,这都很有用。
但是,如果C和D存储库需要不同的连接字符串,则此解决方案将不再起作用。我能想到的最好的解决方法是使用类似下面的内容
builder.RegisterType<ATypeRepository>()
.As<IATypeRepository>()
.OnActivating(c => c.Instance.ResourceFactory = new SqlDatabaseResourceFactory("MyConnectionStringKey"));
但是现在需要对已注册的每个存储库类型执行此操作,这似乎过于重复和笨重。是否有更好的解决方案来解决这类问题。这个问题是否存在一些潜在的架构问题?
答案 0 :(得分:1)
例如,如果C和D存储库需要不同的连接字符串,
如果C和D需要不同的连接,他们应该得到自己的抽象。例如,定义IBillingDatabaseResourceFactory
和IShippingDatabaseResourceFactory
。这解决了目前在您的设计和DI配置中的模糊性。
答案 1 :(得分:0)
您可以使用:
builder.Register(c => new CTypeRepository(new SqlDatabaseResourceFactory("C-connectionstring")).As<ICTypeRepository>().PropertiesAutowired();