2012-11-20 84 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類,它在應用程序中提供您需要的屬性,但不提供數據訪問權限以區分關注點。