Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc Autofac-注入接口的特定实例_Asp.net Mvc_Autofac - Fatal编程技术网

Asp.net mvc Autofac-注入接口的特定实例

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

我有一个ASP.NET MVC项目,其中有两个数据库存储库接口实例(
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类的特定实例绑定。。谢谢你的帮助