我们有一个应用程序将其数据存储在两个不同的数据库中。在未来的某个时刻,我们可能只将数据存储在一个数据库中,因此我们希望尽可能地做出这种改变。出于这个原因,我们将DbContexts包装在一个MyDataContext中,该MyDataContext被注入到我们的UnitOfWork和Repository类中。
class MyDataContext : IDataContext {
internal Database1Context Database1;
internal Database2Context Database2;
}
class UnitOfWork : IUnitOfWork {
MyDataContext myDataContext;
public UnitOfWork(MyDataContext myDataContext) {
this.myDataContext = myDataContext;
}
public Save() {
//todo: add transaction/commit/rollback logic
this.myDataContext.Database1.SaveChanges();
this.myDataContext.Database2.SaveChanges();
}
}
class Database1Context : DbContext {
public DbSet<Customer> Customers { get; set; }
}
class Database2Context : DbContext {
public DbSet<Customers> CustomerProfile { get; set; }
}
class CustomerRepository : ICustomerRepository {
MyDataContext myDataContext;
public CustomerRepository(MyDataContext myDataContext) {
this.myDataContext = myDataContext;
}
public GetCustomerById(int id) {
return this.myDataContext.Database1.Customers.Single(...);
}
}
我的第一个问题是,我做得对吗?我一直在做很多阅读,但不可否认的是,DDD在这一点上有点压倒性。
我的第二个问题是IUnitOfWork和IDataContext接口所在的应用程序层是什么?我知道存储库的接口存在于应用程序的Core / Domain层/程序集中,但不确定这两个。这两个甚至应该有接口吗?
答案 0 :(得分:0)
我的第一个问题是,我做得对吗?
您可以这样做,但首先要重新考虑为什么您首先在不同的地方存储数据。不同的聚合在起作用吗?此外,如果您希望在事务中提交对两个不同数据库的更改,则需要使用最好避免的两阶段提交。如果你有不同的聚合,也许你可以单独保存它们?
我的第二个问题是应用程序的哪一层做了 IUnitOfWork和IDataContext接口位于?
这些可以放在应用程序层中。