Domain driven design AnemicDomainModel-需要更简单的解释吗

Domain driven design AnemicDomainModel-需要更简单的解释吗,domain-driven-design,Domain Driven Design,我今天读了这篇文章,试图澄清一些事情。本文是否意味着模型对象应该包含业务逻辑? 例如,让我们假设有一个Student对象,我们通过Hibernate从数据库中检索它。这篇文章是否说Student对象也应该包含业务逻辑,而不是只有getter和setter?请注意日期-引用时间超过8年 马丁·福勒显然是一个非常聪明的人,我喜欢这篇文章的观点,但对此持保留态度。将状态和行为封装在一起通常是一件好事,但它应该与分层考虑因素相平衡。持久性与业务逻辑不是一回事。我仍然有一个单独的持久性层;我不会将持久性放

我今天读了这篇文章,试图澄清一些事情。本文是否意味着模型对象应该包含业务逻辑?
例如,让我们假设有一个Student对象,我们通过Hibernate从数据库中检索它。这篇文章是否说Student对象也应该包含业务逻辑,而不是只有getter和setter?

请注意日期-引用时间超过8年

马丁·福勒显然是一个非常聪明的人,我喜欢这篇文章的观点,但对此持保留态度。将状态和行为封装在一起通常是一件好事,但它应该与分层考虑因素相平衡。持久性与业务逻辑不是一回事。我仍然有一个单独的持久性层;我不会将持久性放在模型对象中


教条应该受到各种形式的挑战。注意别人的想法,但要为自己着想。

注意日期——引文已经超过八年了

马丁·福勒显然是一个非常聪明的人,我喜欢这篇文章的观点,但对此持保留态度。将状态和行为封装在一起通常是一件好事,但它应该与分层考虑因素相平衡。持久性与业务逻辑不是一回事。我仍然有一个单独的持久性层;我不会将持久性放在模型对象中


教条应该受到各种形式的挑战。注意别人的想法,但要为自己着想。

忽略日期,马丁·福勒所说的与八年前同样重要。Fowler没有说应该将持久性混合到域对象中,恰恰相反:

还值得强调的是,将行为放入域对象不应与使用分层将域逻辑与持久性和表示责任等分离的可靠方法相矛盾

你应该再读一遍这篇文章,因为这篇文章很好地描述了这种反模式,但我将尝试在你提问的上下文中为你总结一下:

如果要创建域模型,那么域对象应该包含业务逻辑和状态,并且对域实体状态的更改应该通过传递业务含义的方法来完成。贫血的领域模型是一种反模式,因为你需要额外增加一层类的成本,但你没有从中获益。当域层传达与使用活动记录样式的方法数据集等完全相同的意图时,为什么还要麻烦您将其映射到数据库?因此,本文并没有说您应该拥有一个student对象,但它指出,如果您拥有一个student对象,那么您应该向该类添加state

由于目前可用的技术,本文中关于如果您不为域建模,就没有一组对象来表示您的模型的观点可能有点令人困惑。有很多很好的工具可以在一组POCO和数据库Nhibernate、EF、Simple data、Massive、Dapper等之间轻松地移动数据,因此回顾一下,我想说,在今天的大多数解决方案中,您可能最终会得到一组实体,真正的区别在于这只是一个数据库模型还是一个真正的域模型

最后,我将向您展示一个域入口点命令处理程序和域模型之间交互的示例。下面显示的方法存在于命令处理程序中,该命令处理程序使用请求来更改域中的某些内容。请注意,域代码的ontop层只是获取域实体并调用域上的一个方法?这一点很重要,因为我们正在建模的工作流完全封装在域中,而不是域代码的顶层或其他任何地方:

    public void Handle(AddEmailAddressForAlerts command)
    {
        var agent = _repository.GetAgent(command.AgentKey.AgentId);
        agent.AddEmailAddressForAlerts(new EmailAddress(command.EmailAddress));
    }

抛开日期不谈,马丁·福勒所说的与八年前同样重要。Fowler没有说应该将持久性混合到域对象中,恰恰相反:

还值得强调的是,将行为放入域对象不应与使用分层将域逻辑与持久性和表示责任等分离的可靠方法相矛盾

你应该再读一遍这篇文章,因为这篇文章很好地描述了这种反模式,但我将尝试在你提问的上下文中为你总结一下:

如果要创建域模型,那么域对象应该包含业务逻辑和状态,并且对域实体状态的更改应该通过传递业务含义的方法来完成。贫血的领域模型是一种反模式,因为你需要额外增加一层类的成本,但你没有从中获益。为什么要麻烦使用一个域层,当它准确地传达了 与使用活动记录样式的方法数据集等获得的目的相同?因此,本文并没有说您应该拥有一个student对象,但它指出,如果您拥有一个student对象,那么您应该向该类添加state

由于目前可用的技术,本文中关于如果您不为域建模,就没有一组对象来表示您的模型的观点可能有点令人困惑。有很多很好的工具可以在一组POCO和数据库Nhibernate、EF、Simple data、Massive、Dapper等之间轻松地移动数据,因此回顾一下,我想说,在今天的大多数解决方案中,您可能最终会得到一组实体,真正的区别在于这只是一个数据库模型还是一个真正的域模型

最后,我将向您展示一个域入口点命令处理程序和域模型之间交互的示例。下面显示的方法存在于命令处理程序中,该命令处理程序使用请求来更改域中的某些内容。请注意,域代码的ontop层只是获取域实体并调用域上的一个方法?这一点很重要,因为我们正在建模的工作流完全封装在域中,而不是域代码的顶层或其他任何地方:

    public void Handle(AddEmailAddressForAlerts command)
    {
        var agent = _repository.GetAgent(command.AgentKey.AgentId);
        agent.AddEmailAddressForAlerts(new EmailAddress(command.EmailAddress));
    }

基本上,是的。如果你有与域实体相关的复杂行为逻辑,Fowler说你应该在域模型中组织它。基本上,是的。如果你有与域实体相关的复杂行为逻辑,Fowler说你应该在域模型中组织它。谢谢你的回答。你说过我不会把持久性放在模型对象中。但您会将业务逻辑放在模型对象中吗?这不是一个肯定或否定的答案。我将封装使使用我的组件更容易使用的东西。面向服务的体系结构往往更具功能性,这没什么错。谢谢你的回答。你说过我不会把持久性放在模型对象中。但您会将业务逻辑放在模型对象中吗?这不是一个肯定或否定的答案。我将封装使使用我的组件更容易使用的东西。面向服务的体系结构往往更具功能性,这并没有错。人们通常会将域模型与实体混淆,因此我们应该不断地问——我们是否应该将所有的域逻辑放在整个业务逻辑的域模型抽象中——是的!我们应该把所有的域逻辑都放到实体中吗?不!存在域服务等。人们通常会将域模型与实体混淆,因此我们应该不断地问——我们是否应该将所有域逻辑放入整个业务逻辑的域模型抽象中——是的!我们应该把所有的域逻辑都放到实体中吗?不!有域名服务等。