【发布时间】:2013-06-18 11:02:42
【问题描述】:
我有一个关于我的域服务的最佳设计是什么的问题。用例是根据用户选择的条件创建一些实体。
将使用此服务的应用的工作流程:
- 用户选择了一些条件(如日期和其他数据)
- 他得到了实体的“命题”列表。他可以选择所有这些,也可以只选择一些。
- 实体已创建
域服务的最佳设计是什么?我有两个想法:
解决方案 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