Asp.net mvc Autofac-注入接口的特定实例
我有一个ASP.NET MVC项目,其中有两个数据库存储库接口实例(Asp.net mvc Autofac-注入接口的特定实例,asp.net-mvc,autofac,Asp.net Mvc,Autofac,我有一个ASP.NET MVC项目,其中有两个数据库存储库接口实例(IDBSessionFactory):一个用于数据数据库,另一个用于配置数据库。在我的引导程序中,我是这样连接DI的: // using ... builder.Register(c => new DbSessionFactory("dataDB", Assembly.GetExecutingAssembly())) .Named<IDbSessionFactory>("datadb") .I
IDBSessionFactory
):一个用于数据数据库,另一个用于配置数据库。在我的引导程序中,我是这样连接DI的:
// 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());
//使用。。。
Register(c=>newdbsessionfactory(“dataDB”,Assembly.getExecutionGassembly()))
.命名为(“datadb”)
.InstancePerHttpRequest()实例
.InstancePerApiRequest();
Register(c=>newdbsessionfactory(“configDB”,Assembly.getExecutionGassembly()))
.命名(“configdb”)
.InstancePerHttpRequest()实例
.InstancePerApiRequest();
RegisterController(Assembly.getExecutionGassembly());
我有一些控制器类,它们需要IDBSessionFactory
的“configDB”
实例作为输入参数。我该如何实现这一目标
感谢您的帮助。在Autofac中,注册是wins中的最后一个。这意味着,在调用
RegisterController
后,只需对要覆盖的控制器进行一次性注册,即可生效
示例:
builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.Register(c =>
new FooController(c.ResolveNamed<IDbSessionFactory>("configDB")));
// ...
container.Resolve<FooController>() // Resolves FooController with configDB
builder.RegisterController(Assembly.getExecutionGassembly());
builder.Register(c=>
新的FooController(c.ResolveName(“configDB”));
// ...
container.Resolve()//使用configDB解析FooController
我想出来了。注册控制器时,必须使用命名的参数。我的策略是根据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>())
});
builder.RegisterController(Assembly.getExecutionGassembly())。带参数(新[]{
新的ResolvedParameter((p,c)=>p.Name==“dbSessionFactory”,(p,c)=>c.ResolveNamed(“datadb”))
});
//注册需要特定命名类型的控制器
builder.RegisterType().WithParameters(新[]{new ResolvedParameter((p,c)=>p.Name==“sessionFactory”,(p,c)=>c.resolvedNamed(“configdb”));
//将帐户控制器与配置数据库实例连接起来,因为所有的用户表都在那里
builder.RegisterType().WithParameters(新[]{
新的ResolvedParameter((p,c)=>p.Name==“dbSessionFactory”,(p,c)=>c.ResolveNamed(“configdb”))
,新的ResolvedParameter((p,c)=>p.Name==“logger”,(p,c)=>c.Resolve())
,新的解析参数((p,c)=>p.Name==“formsAuth”,(p,c)=>c.Resolve())
});
你确定吗?当我按照您的建议执行操作时,Autofac会抛出一个异常,因为它不知道要注入哪个实例,因为我在上面的示例中已注册了两个命名实例。@Shailen Sukul:假设您有一个名为FooController
的控制器,它为您注册。然后,您可以手动注册FooController
,并通过ResolveNamed
引用“configDB”或“dataDB”组件。解析FooController
时,Autofac将提供手动注册,而不是自动注册。这有意义吗?我确实使用了ResolveNamed和ResolvedParameter来让它工作。。这个组合对我起了作用。。我的观点是wins中的最后一部分没有如预期的那样起作用。。我必须显式地将每个控制器与IDBSessionFactory类的特定实例绑定。。谢谢你的帮助