0

在我的域模型中,我有一个 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; }

这些属性在我看来就像一个“服务”或“帮助”属性,我不打算在我的应用程序中到处使用它们,只是几次,但我需要它们。我能想到的最简单的事情是我将这些“服务”属性添加到我的 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; }
}

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

4

2 回答 2

2

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

这里的问题似乎是您的查询要求与实体的形状不符。在这种情况下,您可以灵活地将读取模型与域模型分离。读取模型旨在满足查询要求,您的域模型旨在托管与您的域相关联的行为。

于 2012-11-20T16:44:05.997 回答
1

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

如果你认为你的Group对象是一个数据访问对象,并且你有一个单独的模型,比如 viewdata,那么你是对的。

但这也可能是一个胖类,提供特定于视图和特定于数据库的代码。这不是完全错误的。

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

于 2012-11-20T16:50:19.547 回答