域模型中对象的实体,值对象或枚举表示

时间:2009-06-21 04:24:00

标签: enums nhibernate-mapping domain-driven-design

我正在尝试建立一个文档管理系统,尽管我已经阅读过关于实体,价值对象,如何选择如何映射它们等等的所有问题......我仍然无法弄清楚“正确的“做到这一点的方法是。通常在这样的场景中,每个文档都可以属于一个或多个类别,可以由属于一个或多个角色等的用户查看...所以文档实体看起来像这样:

public class Document
{
    private int _id;
    private string _title;
    private string _brief;
    private DateTime _publicationDate;
    private string _author;
    private string _source;
    private DateTime _activeDate;
    private DateTime _inactiveDate;
    private IList<Category> _categories;
    private IList<Fund> _funds;
    private IList<Role> _roles;
    ...etc
}

应用程序的实际域mondel和业务逻辑目前相当薄,因此Category,Fund和Role对象不包含任何业务逻辑,实际上只是分类,访问控制等手段(在角色的情况下)等...因此,在数据库中,我将以“角色”,“类别”,“基金”表格为例,然后会有包含2列的多对多映射表:例如DocumentId和RoleId。因此,我的问题是:

类别,基金,角色等应该在域中表示为实体,例如

public class Role
{
    private int _id;
    private string _name;

    public virtual int Id 
    {
        get { return _id; }
        private set { _id = value; }
    }

    public virtual string Name 
    {
        get { return _name; }
        private set { _name = value; }
    }
}

或作为值对象或者例如Roles应该是枚举:

public enum Role
{
    AllUsers
    ,ShareHhlders
    ,Registered
    ,Administrator
}

我从实体方法开始,但现在我正在尝试创建“添加文档”功能和UI并质疑它是否是正确的方法 - 在添加文档UI中,用户获取复选框列表组并选择哪些类别,角色资金等...文件将属于。 Onec将此信息传递给控制器​​(我使用的是ASP.NET MVC)如果选中了复选框,则需要创建类别/角色/基金等...并将其添加到文档对象中,但这样做需要类别/角色/基金的ID。因此,这意味着我必须在应用程序中维护映射对象,以使给定类别/规则/基金的类别/角色/基金ID传递给类别/角色/基金对象的构造函数。这真的不对,因此我问这个问题。

我开始尝试将对象更改为枚举,但是用于参照完整性的枚举和类别/角色/基金/多对多映射表将需要单独维护。这可能似乎是满足持久性的要求,但在数据库级别,我认为有必要维护单独的类别/角色/资金表,映射表和外键约束。 (同样使用NHibernate进行ORM映射和持久化应该能够让它与enumss一起玩得很好)。

由于

1 个答案:

答案 0 :(得分:2)

在实体和值对象之间进行选择时,确定对象是否具有可以更改的内部部件的唯一标识非常重要。如果对象具有唯一标识并支持内部更改,是否需要跟踪或持久保存到数据库?简而言之,您是否需要在这些对象上持久存在CRUD操作?如果是这样,您可能拥有实体。如果没有,您可能有一个价值对象。

我的直觉是,如果您可以创建枚举而不是实体,那么您不需要实体对象。我投票使用NHibernate保存外键以实现参照完整性。