将多个EF上下文注册到DI容器中

时间:2015-02-19 17:12:15

标签: c# entity-framework dependency-injection ninject repository-pattern

我开始使用域驱动设计概念开发应用程序并为架构应用n层模式。我的问题与this question有关:因为我需要创建一个或多个数据库上下文。

我没有使用new关键字来实例化我的上下文,而是使用Ninject创建D.I.容器并自动解决所有依赖关系,但这里开始混乱!

这基本上就是我在这里:

public interface IDataContext : IDisposable 
{ 
}

public abstract class DataContext : DbContext, IDataContext 
{
}

public class ContextA : DataContext
{
}

public class ContextB : DataContext
{
}

第一个问题是如何在实现相同的界面时注册上下文?

第二个问题是如何调用存储库,例如:

public class MyClass(IUserRepository userRepository, IBankRepository bankRepository)
{
  // IUserRepository is inside ContextA
  // IBankRepository is inside ContextB
}

在上面的示例代码中,我想使用相同的UnitOfWork。这可能吗?

2 个答案:

答案 0 :(得分:1)

  

第一个问题是如何注册上下文   实现相同的界面?

这就是你的问题所在。根据抽象的Liskov Substitution Principle实现应该可以互换而不会导致消费者破坏。由于每个DbContext都有自己的模型,因此消费者通常会期望一个特定的数据模型,并且在您为其提供不同的模型时会中断(在运行时)。

此违规行为会直接导致您注册时出现问题。因此,解决方案是为每个上下文提供自己的抽象,并分别注册这些抽象。

答案 1 :(得分:0)

如果在ContextA中有用户,在ContextB中有银行,则应在接口中反映它,以便使用包含预期实体的上下文构建存储库:

public interface IDataContext : IDisposable 
{ 
}

public interface IContextA : IDataContext
{
   public DbSet<User> Users { get; set; } 
}

public interface IContextB : IDataContext
{
   public DbSet<Bank> Banks { get; set; } 
}

public abstract class DataContext : DbContext, IDataContext 
{
}

public class ContextA : DataContext, IContextA
{
}

public class ContextB : DataContext, IContextB
{
}
相关问题