使用Autofac解决上下文驱动的参数

时间:2013-05-08 17:55:27

标签: c# .net dependency-injection autofac

我正在尝试使用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"));

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

2 个答案:

答案 0 :(得分:1)

  

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

如果C和D需要不同的连接,他们应该得到自己的抽象。例如,定义IBillingDatabaseResourceFactoryIShippingDatabaseResourceFactory。这解决了目前在您的设计和DI配置中的模糊性。

答案 1 :(得分:0)

您可以使用:

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