2

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

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

  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。背后的原因是,在生成命题后,用户可以选择其中的几个,但范围(条件)相同。

4

1 回答 1

3

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

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

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

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

interface IMyDomainRepository
{
    IEnumerable<EntitiyData> GetData(Conditions conditions);
    void Create(IEnumerable<EntityData> entities);
}
于 2013-06-18T11:06:25.477 回答