我第一次使用DDD(在.Net中),因为我正在重新设计遗留企业应用程序的一些核心组件。
我想澄清的是,我们如何在适当的DDD架构中实现持久性?
我意识到域名本身是持久性无知的,应该使用“普遍存在的语言”进行设计,当然不会强制进入本月DAC甚至物理数据库的约束。
我是否认为存储库接口存在于域程序集中,但存储库实现是否存在于持久层中?持久层包含对Domain层的引用,反之亦然?
我的实际存储库方法(CRUD)从哪里调用?
答案 0 :(得分:15)
我是否认为存储库接口存在于域中 程序集,但存储库实现存在于 持久层?持久层包含对的引用 域层,反之亦然?
是的,这是一个非常好的方法。
我的实际存储库方法(CRUD)从哪里调用?
不以CRUD术语思考可能是一个好主意,因为它过于以数据为中心,可能会引导您进入Generic Repository Trap。 Repository有助于管理domain objects的中期和生命结束。 Factories通常负责开始。请记住,当从数据库恢复对象时,它处于DDD视角的中期阶段。这就是代码的样子:
// beginning
Customer preferredCustomer = CustomerFactory.CreatePreferred();
customersRepository.Add(preferredCustomer);
// middle life
IList<Customer> valuedCustomers = customersRepository.FindPrefered();
// end life
customersRepository.Archive(customer);
您可以直接从您的应用程序调用此代码。可能值得下载并查看Evan的DDD Sample。 Unit of Work模式通常用于处理交易和抽象您选择的ORM。
答案 1 :(得分:4)
查看有关该主题的Steve Bohlen has to say。可以找到演示文稿的代码here。
我在演示文稿中找到了有关如何为存储库建模的信息。
答案 2 :(得分:0)
我是否认为存储库接口存在于域中 程序集,但存储库实现存在于 持久层?持久层包含对的引用 域层,反之亦然?
我在这里不同意,让我们说系统由以下层组成:
这里的假设是,您越高,图层的波动性越大(呈现最高,资源/存储最低)。正因为如此,您不希望资源访问层引用业务层,反之亦然!业务层引用资源访问层,您调用DOWN而不是UP!
您将接口/合同放在自己的程序集中,它们在业务层中根本没有用处。