2009-06-21 57 views
1

我試圖建立一個文檔管理系統,儘管我已經閱讀過有關實體,值對象,如何選擇如何映射它們等信息。 ..我仍然無法弄清楚「正確」的方式是什麼。非常典型地在這樣的之情況,每個文檔都可以beong屬於一個或多個類別,可以通過屬於一個或多個角色等用戶查看......所以文檔實體看起來是這樣的:實體,值對象或域模型中的對象的枚舉表示

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; } 
    } 
} 

或值對象還是應該例如角色僅僅是一個枚舉:

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

我與實體開始時的做法,但現在我試圖創建「添加文件」功能和用戶界面,並質疑它是否是正確的方法 - 在添加文檔用戶界面中,用戶獲得複選框列表組,並選擇文檔屬於哪些類別,角色資金等。 Onec這個信息被傳遞給控制器​​(我使用的是ASP.NET MVC),如果已經選擇了一個複選框,那麼類別/角色/資金等等需要被創建並添加到文檔對象中,但是要這樣做類別/角色/資金的ID是必需的。因此,這意味着我必須在應用程序內維護映射對象,以獲得給定類別/角色/基金的類別/角色/資金ID,以傳遞給類別/角色/基金對象的構造者。這真的看起來不正確,因此我問這個問題。

我開始嘗試將對象更改爲枚舉,但之後需要單獨維護用於引用完整性的枚舉和類別/角色/基金/多對多映射表。這可能似乎是滿足持久性的要求,但在數據庫級別,我認爲有必要維護單獨的類別/角色/資金錶,映射表和外鍵約束。 (也使用NHibernate進行ORM映射和持久化應該能夠讓它在枚舉中表現良好)。

感謝

回答

2

當實體和值對象之間進行選擇,重要的是要確定對象具有可以改變內部部件的唯一標識。如果對象具有唯一標識並支持內部更改,那麼需要跟蹤這些更改還是將其持久保存到數據庫?總之,你需要堅持這些對象的CRUD操作嗎?如果是這樣,你可能有一個實體。如果不是,你可能有一個價值對象。

我的直覺說,如果你可以創建枚舉而不是實體,那麼你不需要實體對象。我投票使用NHibernate保存用於參照完整性的外鍵。

+0

感謝凱文 - 在這個階段,申請的類別/基金/角色對象沒有必要支持內部更改/操作。這些對象確實具有唯一的標識,但它僅用於數據庫標識和參照完整性的目的。基於此,仍然要去查找枚舉並處理以下缺點: 1。手動維護類別/資金/角色表和枚舉(在沒有代碼生成的情況下) 2.重新編譯應用程序以更改類別/資金/角色。 – Matthew 2009-06-21 05:21:04