我在我的控制器中使用构造函数注入来通过在我的DI容器中注册的contextFactory处理多个上下文(EF代码优先)。我有3个ProductXContexts继承自我的CoreContext。我在一个单独的项目中有每个上下文。目前,我的MCV项目都引用了它们。 我想保留引用的基本上下文(CoreContext),但删除ProductXContext引用并使用Unity在运行时解析并注入依赖项。
目前我正在使用流畅的配置来设置我的容器:
var container = new UnityContainer();
container.RegisterType<CoreContext>(new InjectionFactory(c => ContextFactory.CreateContext()));
上下文工厂看起来像这样:
public static CoreContext CreateContext()
{
var userProduct = HttpContext.Current.Session["Product"] as string;
CoreContext context;
switch (userProduct)
{
case null:
throw new Exception("No product is selected. Can't define an appropriate context.");
case "Product 1":
context = new Product1Context();
break;
case "Product 2":
context = new Product2Context();
break;
case "Product 3":
context = new Product3Context();
break;
default:
throw new Exception("Current product is not supported. Can't define an appropriate context.");
}
return context;
}
控制器是这样的:
public class MyController : Controller
{
private CoreContext _context;
public MyController(CoreContext context)
{
_context = context;
}
...
}
因此,如果我要从我的MVC项目中删除ProductXContext引用,我似乎必须切换到XML配置,因为为了编译流畅的代码,您必须引用所有代码。但我现在想到了:
PS:有没有办法使用XML配置注册外部类型,然后使用fluent配置声明injectionFactory?
提前致谢!
答案 0 :(得分:0)
如果您需要支持延迟绑定而不直接引用 ProductXContext 项目,则可以使用其他解决方案。 TecX project包含Unity的增强配置引擎,允许您扫描程序集以查找某些类型的实现并自动注册它们。它还有Castle Windsor的一个名为Typed Factories的功能,可以自动生成像 ContextFactory 这样的工厂。