Tag: domain driven design

Spring环境中的域驱动设计和事务

我曾经围绕贫血领域模型设计我的应用程序,因此我有许多存储库对象,这些对象被注入到大的,胖的,事务感知服务层。 此模式称为事务脚本。 它不是一个好的做法,因为它会导致程序代码,所以我想继续前进到域驱动设计。 在网上阅读了几篇文章后,听了Chris Richardson关于Parleys的演讲并阅读了POJO in Action的DDD章节,我想我得到了全局。 问题是,我不知道,如何在我的应用程序中组织事务。 Chis Richardson在他的书中指出: 表示层通过直接或间接通过façade调用域模型来处理来自用户浏览器的HTTP请求,正如我在前一章中描述的那样,它是POJO或EJB。 好到目前为止,但InfoQ上的Srini Penchikala 文章指出: 一些开发人员更喜欢在DAO类中管理事务,这是一种糟糕的设计。 这导致过于细粒度的事务控制,这不能提供管理事务跨越多个域对象的用例的灵活性。 服务类应该处理事务; 这种方式即使事务跨越多个域对象,服务类也可以管理事务,因为在大多数用例中,Service类处理控制流。 好的,所以如果我理解正确的话,存储库类不应该是事务性的,服务层(现在更薄)是事务性的(因为它曾经是在事务脚本模式中)。 但是如果域对象直接被表示层调用呢? 这是否意味着我的域对象应该具有事务行为? 以及如何在Spring或EJB环境中实现它? 这对我来说似乎有些奇怪,所以如果有人澄清这一点,我会很高兴。 谢谢。

如何避免使用域驱动设计的非常大的对象

我们正在关注领域驱动设计以实现大型网站。 但是,通过将行为放在域对象上,我们最终得到了一些非常大的类。 例如,在我们的WebsiteUser对象上,我们有许多方法 – 例如处理密码,订单历史记录,退款,客户细分。 所有这些方法都与用户直接相关。 其中许多方法内部委托给其他子对象但是 这仍然导致一些非常大的类。 我很想避免暴露很多子对象,例如user.getOrderHistory()。getLatestOrder()。 还有什么其他策略可以避免这个问题?

为什么在服务和dao层中总是有单个实现接口?

我已经/看过一些spring-hibernate Web应用程序项目,它们具有与实际服务和dao类一样多的接口。 我一直认为这两个是这些单一实现接口的主要原因: Spring可以将实际实现连接为给定类中的依赖项(松散耦合) public class Person { @Autowired private Address address; @Autowired private AccountDetail accountDetail; public Person(Address address, AccountDetail accountDetail) { // constructor 在进行unit testing时,我可以创建模拟类并单独测试类。 Address mockedAddress = mock(Address); AccountDetail mockedAccountDetail = mock(AccountDetail); Person underTestPerson = new Person(mockedAddress, mockedAccountDetail); // unit test follows 但是,最近,我意识到: Spring可以将具体实现类连接为依赖项: public class Person { @Autowired private AddressImpl address; @Autowired […]