UnitOfWork /使用DDD应用程序中的多个数据库

时间:2013-06-26 02:36:02

标签: domain-driven-design repository-pattern unit-of-work

我们有一个应用程序将其数据存储在两个不同的数据库中。在未来的某个时刻,我们可能只将数据存储在一个数据库中,因此我们希望尽可能地做出这种改变。出于这个原因,我们将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层/程序集中,但不确定这两个。这两个甚至应该有接口吗?

1 个答案:

答案 0 :(得分:0)

  

我的第一个问题是,我做得对吗?

您可以这样做,但首先要重新考虑为什么您首先在不同的地方存储数据。不同的聚合在起作用吗?此外,如果您希望在事务中提交对两个不同数据库的更改,则需要使用最好避免的两阶段提交。如果你有不同的聚合,也许你可以单独保存它们?

  

我的第二个问题是应用程序的哪一层做了   IUnitOfWork和IDataContext接口位于?

这些可以放在应用程序层中。