DDD和实现持久性

时间:2011-08-23 16:04:24

标签: domain-driven-design repository

我第一次使用DDD(在.Net中),因为我正在重新设计遗留企业应用程序的一些核心组件。

我想澄清的是,我们如何在适当的DDD架构中实现持久性?

我意识到域名本身是持久性无知的,应该使用“普遍存在的语言”进行设计,当然不会强制进入本月DAC甚至物理数据库的约束。

我是否认为存储库接口存在于域程序集中,但存储库实现是否存在于持久层中?持久层包含对Domain层的引用,反之亦然?

我的实际存储库方法(CRUD)从哪里调用?

3 个答案:

答案 0 :(得分:15)

  

我是否认为存储库接口存在于域中   程序集,但存储库实现存在于   持久层?持久层包含对的引用   域层,反之亦然?

是的,这是一个非常好的方法。

  

我的实际存储库方法(CRUD)从哪里调用?

不以CRUD术语思考可能是一个好主意,因为它过于以数据为中心,可能会引导您进入Generic Repository TrapRepository有助于管理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 SampleUnit of Work模式通常用于处理交易和抽象您选择的ORM。

答案 1 :(得分:4)

查看有关该主题的Steve Bohlen has to say。可以找到演示文稿的代码here

我在演示文稿中找到了有关如何为存储库建模的信息。

答案 2 :(得分:0)

  

我是否认为存储库接口存在于域中   程序集,但存储库实现存在于   持久层?持久层包含对的引用   域层,反之亦然?

我在这里不同意,让我们说系统由以下层组成:

  • 演示层(获胜表格,网页表格,asp.net MVC,WPF,php,qt,java,ios,android等)
  • 业务层(有时称为经理或服务,逻辑在这里)
  • 资源访问层(手动或ORM)
  • 资源/存储(RDBMS,NoSQL等)

这里的假设是,您越高,图层的波动性越大(呈现最高,资源/存储最低)。正因为如此,您不希望资源访问层引用业务层,反之亦然!业务层引用资源访问层,您调用DOWN而不是UP!

您将接口/合同放在自己的程序集中,它们在业务层中根本没有用处。

相关问题