我正在研究一个核心项目中包含DbContext
(名为CoreContext
)的解决方案。此上下文包含一个实体(Product)和其他几个实体,它引用了一个抽象类(ProductConstraints),它为一般产品提供了通用的验证规则。永远不会直接使用此上下文。在同一解决方案中还有三个其他项目(Product1,Product2和Product3),它们继承CoreContext
(作为ProductXContext)和ProductConstraints
(作为ProductXConstraints)类,为其特定产品实现自定义验证规则。 / p>
还有另一个包含自定义CodeFirstMembership
的项目。它的“用户”实体包含一个“产品”属性,用于定义用户将使用的产品。
最后,我有一个MVC3项目,我希望根据当前用户的“产品”信息实例化适当的上下文。创建类似ContextFactory
的内容,以接收此产品并返回正确的DbContext
。我尝试了一些方法但没有取得重大成功。
答案 0 :(得分:3)
您可以使用依赖注入来解决您的问题。如果用户只绑定了一个产品,您可以将该详细信息存储在Session
中,以避免往返数据库。
public class ContextFactory
{
public CoreContext CreateContext()
{
var product = HttpContext.Current.Session["Product"] as string;
//resolve the correct context
return context;
}
}
然后您可以使用DI容器注册工厂。
builder.Register(c => ContextFactory.CreateContext()).As<CoreContext>();
然后您可以在控制器中使用构造函数注入
public class MyController : Controller
{
public MyController(CoreContext context)
{
}
}