在我的域模型中,我有一个Entity对象,如下所示:
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;
}
}
但是现在我需要通过我创建的存储库中的新函数从数据存储中获取有关Group对象的一些额外信息,以下是我需要的字段:
public bool HasChildGroups { get; set; }
public int ChildGroupsCount { get; set; }
public bool HasDeals { get; set; }
public int DealsCount { get; set; }
这些属性在我看来就像一个"服务"或者"帮助者"属性,我不打算在我的应用程序中到处使用它们,只有几次,但我需要它们。我能想到的最简单的事情就是我添加了这些" service"属性到我的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 :(得分:2)
要问的第一个问题是如何管理建议的GroupHelper
对象的状态。诸如HasChildGroups之类的属性似乎会因在Group
实体上调用的行为而被更改。如果是这样,那么它们应该是域模型中的第一类实体,也许是组实体本身的事件部分。如果属性是在域模型之外管理的,那么您可以像查询任何其他外部数据源一样查询该数据。我希望这是一个独立的对象,可能称为GroupInfo
,而不是扩展Group本身。
这里的问题似乎是您的查询要求与实体的形状不一致。在这种情况下,您可以灵活地将read-models与域模型分离。阅读模型旨在满足查询要求,您的域模型旨在托管与您的域相关联的行为。
答案 1 :(得分:1)
HasChildGroups [...]看起来像“服务”或“助手”属性[...]但我认为这样做是错误的,因为它是实体,我不需要它们在这里。
如果您将Group
对象设为数据访问对象并且您拥有一个单独的模型,比如viewdata,那么您就是对的。
但这也可能是一个胖类,提供特定于视图的和数据库特定代码。这不是完全错的。
您确实可以创建一个GroupDTO
类,它提供应用程序中所需的属性,但不提供数据访问,以分离关注点。