DDD和实现持久性

Eko*_*tin 19 domain-driven-design repository

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

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

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

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

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

Dmi*_*try 15

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

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

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

不以CRUD术语思考可能是一个好主意,因为它太以数据为中心,可能会引导您进入Generic Repository Trap.存储库有助于管理域对象的中间和生命结束.工厂经常负责开始.请记住,当从数据库恢复对象时,它处于DDD视角的中期阶段.这就是代码的样子:

// beginning 
Customer preferredCustomer = CustomerFactory.CreatePreferred();
customersRepository.Add(preferredCustomer);

// middle life
IList<Customer> valuedCustomers = customersRepository.FindPrefered();

// end life
customersRepository.Archive(customer);
Run Code Online (Sandbox Code Playgroud)

您可以直接从您的应用程序调用此代码.可能值得下载并查看Evan的DDD示例.工作单元模式通常用于处理交易和抽象您选择的ORM.

  • 我同意Dmitry在这里所说的一切,为了清楚起见,我唯一要补充的是我建议你的客户端/ UI项目引用一个'Application Services'层,它调用域上的方法(域聚合或域服务) )并从这里调用存储库.这样,所有逻辑都包含在此应用程序服务中,您可以轻松地更改/添加用户界面. (3认同)

Jes*_*cer 5

看看史蒂夫·博伦(Steve Bohlen) 就这个话题怎么说。可以在此处找到演示文稿的代码。

我参加了演示,发现有关如何对存储库进行建模的信息很好。