首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >贫血域模型与领域服务注入

贫血域模型与领域服务注入
EN

Software Engineering用户
提问于 2015-12-17 15:20:00
回答 2查看 923关注 0票数 19

Martin将贫血域模型描述为领域驱动设计中的反模式.为了在域模型上具有业务逻辑,经常使用域服务。但是Vaughn Vernon认为将域服务注入域模型是有害的(参见“实现领域驱动设计,第387页”)。

在我看来,这些意见是矛盾的,这是真的吗?如何考虑这两点呢?

它真的是丰富的领域模型,领域服务注入与贫血领域模型和正常领域服务?

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2015-12-17 16:23:23

贫血模型只是一个数据容器。它不包含行为。(在功能范例中,这实际上是一件好事。)贫血模型的相反之处不是注入满域服务的模型。你描述的是两个极端--都很糟糕。

如果你有贫血模型,你不会完全接受OOP提供的东西。如果您开始将服务注入到这些模型中,则可能会注入不属于这些模型的关注点。或者你的模型比你想象的更贫血。为什么你还需要这种服务,而不是它所提供的所需但缺失的东西?(失踪可能意味着贫血。)

避免这两个“告诉”导致更强大的设计。你在服务中有模型需要的东西吗?也许它应该移到模型上去。如果没有,也许你应该重新考虑你的担忧。模型的行为应该在模型内部工作。它应该主要(如果不只是)与成员有关。但是请记住,仍然会有一些东西在模型上或与模型一起工作。例如,模型不应该打开TCP连接或侦听UI事件,即使它们在某种程度上涉及到它们。这是别人的责任,而且这个人永远不属于模特。

票数 16
EN

Software Engineering用户

发布于 2015-12-17 19:01:37

这并不矛盾。两位支持者都希望您将实际代码放在域对象本身中。

即。

代码语言:javascript
复制
public class Order
{
    private string status = "not bought";
    public void Buy()
    {
        this.status = "bought";
    }
}

对ADM

代码语言:javascript
复制
public class Order
{
    public string Status = "not bought";
}

public class BuyingService
{
    public Order Buy(Order order)
    {
         Order o = new Order();
         o.status = "bought";
         return o;
    }
}

vs注入服务

代码语言:javascript
复制
public class Order
{
    public Order(IBuyingService bs)
    {
        _bs = bs;
    }
    private IbuyingService _bs;
    private string status = "not bought";
    public void Buy()
    {
        this.status = _bs.Buy();
    }
}

public class BuyingService : IBuyingService
{
    public string Buy()
    {
         return = "bought";
    }
}

坦率地说,尽管每种方法都有优缺点。你所选择的主要是个人喜好的问题。

票数 7
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/305321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档