Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.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
C# 简单注入器:所选控制器的不同DbContext_C#_Asp.net Mvc_Entity Framework_Dependency Injection_Simple Injector - Fatal编程技术网

C# 简单注入器:所选控制器的不同DbContext

C# 简单注入器:所选控制器的不同DbContext,c#,asp.net-mvc,entity-framework,dependency-injection,simple-injector,C#,Asp.net Mvc,Entity Framework,Dependency Injection,Simple Injector,我试图在我的MVC应用程序中分离读/写操作。我使用Simple Injector作为Ioc,我有以下结构: new Service( new Repository( new UnitOfWork( new DbContext()))) 因此,UnitOfWork根据web请求注册所有剩余的Transient 所以,我们的想法是创建单独的只读控制器,并注册DbContext,以便在控制器为只读时提供不同的连接。这可以用实现,但在我的例子中不起作用,因为不是所有的图节

我试图在我的MVC应用程序中分离读/写操作。我使用Simple Injector作为Ioc,我有以下结构:

new Service(
  new Repository(
     new UnitOfWork(
        new DbContext())))
因此,
UnitOfWork
根据web请求注册所有剩余的
Transient

所以,我们的想法是创建单独的只读控制器,并注册
DbContext
,以便在控制器为只读时提供不同的连接。这可以用实现,但在我的例子中不起作用,因为不是所有的图节点都是瞬态的


是否有任何方法(比使用改进的RegisterWithContext扩展注册每个存储库更优雅,其中需要提供另一个只读
UnitOfWork
,并手动解析传递到
存储库的所有其他参数
)如何实现所描述的场景?

由于选择基于控制器的类型,因此您可以在自定义的
IControllerFactory
中进行说明。例如:

public class ConnectionSelector {
    public bool AsReadOnly { get; set; }
}

private class ReadOnlySwitchControllerFactory : DefaultControllerFactory {
    private readonly Container container;

    public ReadOnlySwitchControllerFactory(Container container) {
        this.container = container;
    }

    protected override IController GetControllerInstance(RequestContext requestContext, 
        Type controllerType) {
        var selector = this.container.GetInstance<ConnectionSelector>();

        selector.AsReadOnly = 
            typeof(IReadOnlyController).IsAssignableFrom(controllerType);

        return base.GetControllerInstance(requestContext, controllerType);
    }
}
公共类连接选择器{
公共bool AsReadOnly{get;set;}
}
私有类ReadOnlySwitchControllerFactory:DefaultControllerFactory{
专用只读容器;
公共只读开关控制器工厂(容器){
this.container=容器;
}
受保护的重写IController GetControllerInstance(RequestContext RequestContext,
类型控制器类型){
var selector=this.container.GetInstance();
selector.AsReadOnly=
typeof(IReadOnlyController)。可从(controllerType)中指定;
返回base.GetControllerInstance(requestContext,controllerType);
}
}
您可以按如下方式注册:

container.RegisterPerWebRequest<ConnectionSelector>();

container.RegisterPerWebRequest<DbContext>(() => new DbContext(
    container.GetInstance<ConnectionSelector>().AsReadOnly 
        ? "ReadOnlyConnection" 
        : "NormalConnection"));

container.RegisterSingle<IControllerFactory>(
    new ReadOnlySwitchControllerFactory(container));
container.registerWebRequest();
container.registerWebRequest(()=>newdbcontext(
container.GetInstance().AsReadOnly
?“只读连接”
:“正常连接”);
container.RegisterSingle(
新的只读开关控制器工厂(容器);

谢谢你,如此复杂的方法-正是我所需要的。作为替代方案,你也可以将抽象添加到你的应用程序中(如
IConnectionSelector
),并将其注入你的
DbContext