0

我们有一个应用程序将其数据存储在两个不同的数据库中。在未来的某个时候,我们可能只会将我们的数据存储在一个数据库中,因此我们希望进行这种更改尽可能地痛苦。出于这个原因,我们将 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 接口驻留在应用程序的哪一层?我知道存储库的接口存在于应用程序的核心/域层/程序集中,但不确定这两个。这两个甚至应该有接口吗?

4

1 回答 1

0

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

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

我的第二个问题是 IUnitOfWork 和 IDataContext 接口驻留在应用程序的哪一层?

这些可以放在应用层。

于 2013-07-01T14:57:56.887 回答