2012-11-20 82 views
0

在我的域模型实体对象我有一个实体对象,如下所示:与辅助性

public class Group 
{ 
    public int idGroup { get; set; } 
    public string Description { get; set; } 
} 

我对这个对象存储库:

public class GroupRepository : IGroupRepository 
{ 
    public Group LoadGroup(int idGroup) 
    { 
     //imitation of SQL data reader 
     Group g = new Group(); 
     g.idGroup = Convert.ToInt32(r["idTipoGrupo"]); 
     g.Description = Convert.ToString(r["Descricao"]); 
     return g; 
    } 
} 

但现在我需要得到通过我创建的存储库中的新功能从数据存储中获取有关组对象的额外信息,这里是我需要的字段:

public bool HasChildGroups { get; set; } 
public int ChildGroupsCount { get; set; } 
public bool HasDeals { get; set; } 
public int DealsCount { get; set; } 

这些属性在我看来就像一个“服务”或“助手”属性,我并不打算在我的应用程序中的任何地方使用它们,只有几次,但我需要它们。我能想到的最简单的事情是,我将这些“服务”属性添加到我的Group对象,并在我的存储库中创建了一个方法来填充它们。但我认为做错了,因为它是实体,我不需要它们在这里。那么我应该在哪里保留这样的“服务”对象呢?我一定要创建一个从Group这样继承一个新的类:

public class GroupHelper : Group 
{ 
    public bool HasChildGroups { get; set; } 
    public int ChildGroupsCount { get; set; } 
    public bool HasDeals { get; set; } 
    public int DealsCount { get; set; } 
} 

或者,我应该考虑使用一些数据传输对象? 你会如何解决这个问题? 任何帮助表示赞赏。

+0

您的域模型似乎没有反映出儿童与父母组之间的关系,也不反映组与交易之间的关系。这是正常的吗?你是否期望利用知识库并在每次访问某个组的父母或孩子时发出数据库查询? – guillaume31

+0

@ guillaume31:是的,我没有包含任何额外的属性和实体,在我的情况下它们是不相关的,因为我只需要事先知道关于Group实体的一些事情,而不管将来的父 - 子连接如何,这就是为什么我使用这个对象的术语如“服务”,“帮手”,“DTO”。 –

回答

2

要问的第一个问题是如何管理建议的GroupHelper对象的状态。像HasChildGroups这样的属性看起来好像会因为在实体上调用的行为而被改变。如果是这样,那么他们应该是你领域模型中的第一类实体,也许是组实体本身的事件部分。如果属性在您的域模型之外进行管理,那么您可以像查看其他任何外部数据源一样查询该数据。我想这是一个独立的对象,也许被称为GroupInfo不扩展组本身。

这里的问题似乎是,您的查询要求与实体的形状不一致。在这种情况下,您可以灵活地将您的域名模型中的read-models解耦。阅读模型旨在满足查询要求,您的域模型旨在托管与您的域相关的行为。

1

HasChildGroups [...]在我看来像一个“服务”或“帮手”属性[...]但我认为这样做是错误的,因为它是实体,我不需要它们这里。

如果海外商品会有你Group对象是一个数据访问对象,你有,比如说,可视数据一个独立的模型,你说得对。

但是,这也可以是脂肪类,在视图特定数据库特定的代码提供。这不是一个错误。

确实可以创建一个GroupDTO类,它在应用程序中提供您需要的属性,但不提供数据访问权限以区分关注点。