C# 简单注入器:所选控制器的不同DbContext
我试图在我的MVC应用程序中分离读/写操作。我使用Simple Injector作为Ioc,我有以下结构: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,以便在控制器为只读时提供不同的连接。这可以用实现,但在我的例子中不起作用,因为不是所有的图节
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
。