我开始使用域驱动设计概念开发应用程序并为架构应用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。这可能吗?
答案 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
{
}