2013-02-21 45 views
0

的具体情况我与数据库存储库接口(IDBSessionFactory)的2代实例的ASP.NET MVC的项目:一个是数据的数据库和一个配置数据库。在我的引导程序,这是怎么了布线了DI:Autofac - 注射接口

// using ... 

builder.Register(c => new DbSessionFactory("dataDB", Assembly.GetExecutingAssembly())) 
    .Named<IDbSessionFactory>("datadb") 
    .InstancePerHttpRequest() 
    .InstancePerApiRequest(); 

builder.Register(c => new DbSessionFactory("configDB", Assembly.GetExecutingAssembly())) 
    .Named<IDbSessionFactory>("configdb") 
    .InstancePerHttpRequest() 
    .InstancePerApiRequest(); 

builder.RegisterControllers(Assembly.GetExecutingAssembly()); 

我有需要的IDBSessionFactory"configDB"实例作为输入参数一些控制器类。我如何去实现这个目标?

任何帮助表示赞赏。

回答

2

我计算出来。注册控制器时,必须使用名为的参数。我的策略是根据datadb参数注册所有控制器,然后根据configdb参数注册特定的控制器。观看的唯一的事情就是保持参数名称一致,所有的控制器类。

builder.RegisterControllers(Assembly.GetExecutingAssembly()).WithParameters(new[] { 
         new ResolvedParameter((p, c) => p.Name == "dbSessionFactory", (p, c) => c.ResolveNamed<IDbSessionFactory>("datadb")) 
        }); 

// Register controllers which need a specific named type    
builder.RegisterType<Web.Controllers.AdminController>().WithParameters(new[] { new ResolvedParameter((p, c) => p.Name == "sessionFactory", (p, c) => c.ResolveNamed<IDbSessionFactory>("configdb")) }); 
// Wire up the account controller with the config database instance, since all the user tables are there 
builder.RegisterType<Web.Controllers.AccountController>().WithParameters(new[] { 
         new ResolvedParameter((p, c) => p.Name == "dbSessionFactory", (p, c) => c.ResolveNamed<IDbSessionFactory>("configdb")) 
         , new ResolvedParameter((p,c) => p.Name == "logger",(p,c) => c.Resolve<ILogger>()) 
         , new ResolvedParameter((p,c) => p.Name == "formsAuth",(p,c) => c.Resolve<IFormsAuthentication>()) 
        }); 
0

在Autofac,注册是后进胜。这意味着,在您致电RegisterControllers后,您可以简单地为想要覆盖的控制器执行一次性注册,并且它们将生效。

实施例:

builder.RegisterControllers(Assembly.GetExecutingAssembly()); 

builder.Register(c => 
    new FooController(c.ResolveNamed<IDbSessionFactory>("configDB"))); 

// ... 

container.Resolve<FooController>() // Resolves FooController with configDB 
+0

你确定吗?当我按照你的建议做时,Autofac会抛出一个异常,因为它不知道要注入哪个实例,因为我在上面的示例中已经注册了2个命名实例。 – 2013-02-22 19:05:54

+0

@Shailen Sukul:假设你有一个名为'FooController'控制器,它'RegisterControllers'为您注册。然后您可以手动注册'FooController'并通过'ResolveNamed'引用“configDB”或“dataDB”组件。解析'FooController'时,Autofac将提供您的手边注册*而不是*自动注册*。那有意义吗? – 2013-02-22 21:52:14

+0

我没有使用ResolveNamed随着ResolvedParameter得到它的工作..结合奏效了我..我 点是最后获胜的部分没有按预期工作。我必须每个控制器明确领带与特定实例的IDBSessionFactory类.. 感谢您的帮助 – 2013-03-06 09:47:02