0

我试图找到一种更好的方法来使用 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"));

但是现在需要为注册的每个存储库类型执行此操作,这似乎过于重复和笨拙。这类问题有没有更好的解决方案。这个问题是否表明某些潜在的架构问题?

4

2 回答 2

1

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

如果 C 和 D 需要不同的连接,它们应该有自己的抽象。例如定义 aIBillingDatabaseResourceFactoryIShippingDatabaseResourceFactory。这解决了当前在您的设计和 DI 配置中的歧义。

于 2013-05-08T18:31:38.680 回答
0

你可以使用:

 builder.Register(c => new CTypeRepository(new SqlDatabaseResourceFactory("C-connectionstring")).As<ICTypeRepository>().PropertiesAutowired();
于 2013-05-08T20:20:39.570 回答