【问题标题】:Best design for domain service领域服务的最佳设计
【发布时间】:2013-06-18 11:02:42
【问题描述】:

我有一个关于我的域服务的最佳设计是什么的问题。用例是根据用户选择的条件创建一些实体。

将使用此服务的应用的工作流程:

  1. 用户选择了一些条件(如日期和其他数据)
  2. 他得到了实体的“命题”列表。他可以选择所有这些,也可以只选择一些。
  3. 实体已创建

域服务的最佳设计是什么?我有两个想法:

解决方案 1

interface IMyDomainService
{
    IEnumerable<EntityProposition> GetEntitiesPropositions(Conditions conditions);
    void CreateEntities(Conditions conditions);
}

在这种情况下,我可能会在服务上使用一些私有方法,这些方法都将被两者使用。 EntityProposition 类基本上是视图中显示内容的 1:1。该类中有一些数据不属于实体本身。

解决方案 2

interface IMyDomainService
{
    IEnumerable<EntitiyData> GetDataForEntities(Conditions conditions);
    void CreateEntities(IEnumerable<EntityData> entities);
}

解决方案 1 中的私有方法现在在接口中公开。 EnityData 类保存与创建实体本身和显示所有数据以供查看相关的实体的所有数据。

添加一些上下文: 此服务现在由 ASP.NET MVC 控制器直接使用。在我看来,如果我使用解决方案#2,我将不得不创建一些额外的应用程序服务,因此它将包装获取数据和创建实体的逻辑。

编辑 1

我会从不同的角度问这个问题:我的控制器应该是这样的吗:

public ActionResult GetPropositions(Condtidions condtitions)
{
    var entitiyData= service.GetEntityData(conditions);
    return Json(entitiyData.ToViewModel());
}

public void CreateEntities(Conditions conditions)
{
    var entitiyData= service.GetEntityData(conditions);
    service.CreateEntities(entitiyData);
}

或:

public ActionResult GetPropositions(Condtidions condtitions)
{
    var propositions = service.GetPropositons(conditions);
    return Json(propositions.ToViewModel());
}

public void CreateEntities(Conditions conditions)
{
    service.CreateEntities(conditions);
}

当然这是一个简化的例子,只是为了说明我的观点。

编辑 2

作为后续:首先我采用了解决方案#2,但后来我的要求发生了变化,我不得不回到解决方案#1。背后的原因是在生成命题后,用户可以选择其中的几个,但范围(条件)相同。

【问题讨论】:

  • 我真的希望ToViewModel方法是一个扩展方法。因为它不属于域。至于你的编辑GetPropositons 听起来更像是领域语言。
  • 根本没有“ToViewModel”,只是在示例中显示结果在被检索后映射到视图模型。感谢您的帮助!

标签: c# asp.net-mvc-3 domain-driven-design


【解决方案1】:

最常见的情况是什么?创建多个实体还是创建一个?

另外,我不会在方法名称中使用Entites,很明显服务与实体一起使用。

对我来说,这个名字听起来就像你只是用服务包装了一个存储库。这是一个很大的禁忌。 DDD 中的服务是域实体的扩展,用于封装逻辑,您必须在同一个业务案例中使用两个或多个实体。

如果你只需要获取一个实体,修改它并保存它,你应该直接使用存储库(不需要抽象出抽象)。

interface IMyDomainRepository
{
    IEnumerable<EntitiyData> GetData(Conditions conditions);
    void Create(IEnumerable<EntityData> entities);
}

【讨论】:

  • 至于问题#1-我想说最常见的是从所有命题中创建实体。 “实体”只是占位符-我的代码中有更好的名称:) 这不是简单的获取->编辑->保存。假设我在实体数据中有一些 bool 属性,并且在创建实体时,我有类似 if (that property && somethingelse && x>8) entity.children.add(something)跨度>
  • 逻辑属于实体本身而不是服务。
  • +1 完全同意您的回答。然而,似乎EntityProposition 是域/有界上下文中的另一个实体——而不仅仅是提供给存储库的一堆参数。听起来我们在这里真正想要的是一个工厂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多