2016-04-24 184 views
4

我想解决基于条件的依赖关系。解决条件依赖关系autofac

private static readonly Dictionary<string, Action<ContainerBuilder>> QRTypeDictionary = 
    new Dictionary<string, System.Action<ContainerBuilder>>() { 
      { "REST" , (builder)=> builder 
            .RegisterType<RestPublisher>() 
            .As<Publisher>()}, 
      { "DB" , (builder)=> builder 
            .RegisterType<DBPublisher>() 
            .As<Publisher>()} 
} 

我只是想确定如果这是解决依赖条件的唯一方法。我一直在使用Ninject到目前为止并正在寻找类似如下:

kernel.Bind<Publisher>() 
     .To<DbPublisher>() 
     .When(x => Defs.AppSettings.PublisherType == "DB") 

只是想确认我在做正确的事与Autofac

+1

是'Defs.AppSettings.PublisherType'需要重新启动应用程序来更改配置值,也可以从随时间改变(请求之间例如)? – Steven

回答

6

我可以看到3个解决方案,以实现你想要的。

  1. 使用Lambda

    builder.RegisterType<DbPublisher>().AsSelf(); 
    builder.RegisterType<RestPublisher>().AsSelf(); 
    
    builder.Register(c => { 
        switch(Defs.AppSettings.PublisherType){ 
         case "DB": 
          c.Resolve<DbPublisher>(); 
          break; 
         case "REST": 
          c.Resolve<RestPublisher>(); 
          break; 
         default: 
          throw new NotSupportedException(); 
        } 
    }).As<IPublisher>(); 
    
  2. 使用名为注册

    builder.RegisterType<DbPublisher>().Named<IPublisher>("DB"); 
    builder.RegisterType<RestPublisher>().Named<IPublisher>("REST"); 
    
    builder.Register(c => { 
         var index = c.Resolve<IIndex<String, IPublisher>>(); 
         return index[Defs.AppSettings.PublisherType] 
    }.As<IPublisher>(); 
    
  3. 有条件注册

    如果Defs.AppSettings.PublisherType在注册过程中被定义,你可以简单地有条件注册你的依赖:

    switch(Defs.AppSettings.PublisherType){ 
        case "DB": 
         builder.RegisterType<DbPublisher>().As<IPublisher>(); 
         break; 
        case "REST": 
         builder.RegisterType<RestPublisher>().As<IPublisher>(); 
         break; 
        default: 
         throw new NotSupportedException(); 
    } 
    
+2

这里是文档的推荐方式:http://docs.autofac.org/en/latest/register/registration.html#selection-of-an-implementation-by-parameter-value所以我会追求第一个选项 – Hardrada

+0

所以我的工作是在注册过程中完成的。所以我使用定义的字典(以减少环化复杂性)来解决发布者。 – Farax