2011-05-19 43 views
1

我真的很感激人們對下面的設計問題的看法。DDD,知識庫和角色界面

我有一個模型,其中'Person'或'Business'可能是某個'Service'的提供者。的示例類定義如下:

IProvider
的Guid標識

人:IProvider
的Guid標識

名字

業務:IProvider
的Guid標識
名稱

服務
的Guid標識
IProvider提供商

因此,我在我的域名'Person','Business','IProvider'和'Service'中創建了相關概念。我掙扎的地方在於創建存儲庫的實體。在這種情況下,'服務'是一個聚合根,因此有它自己的存儲庫。 「商業」也是我的上下文中的聚合根,因爲即使它不是提供者,它也會有意義。 '人'只會在系統中創建,如果他們是'提供者'。

我會爲IProvider的角色創建一個存儲庫,它會返回我的'Person'和'Business'實例;我的問題是,代碼可能很快變得非常複雜,因爲任何實現都需要查看多個表等,以返回所有不同類型的IProvider。要創建這樣的方法需要對「人」和'企業的倉庫裏,並注入「IProvider」庫來提供所需的功能,即

public class ProviderRepository : IProviderRepoistory 
{ 
    public IBusinessRepository businessRepository {get; set; } 
    public IPersonRepository personRepository {get; set; } 

    public IProvider FindById(Guid Id){ 
     IProvider entity = businessRepository.FindById(Id); 

     if(entity == null) 
      entity = personRepository.FindById(Id); 

     return entity; 
    } 
} 

另一個appraoch將是對「人」創造資源庫和'商業'實體,它們實現'IProvider'接口,因此可以讓他們參與這個角色。即

public class PersonRepository : IPersonRepository, IProviderRepository 
{ 
    private ISession session;   

    public Person FindById(Guid Id){ 
     return session.Query<Person>().FirstOrDefault<Person>(x => x.Id == Id); 
    } 

    public IProvider FindById(Guid Id){ 
     return session.Query<Person>().FirstOrDefault<Person>(x => x.Id == Id && x.IsProvider == true); 
    } 
} 

然後我會用一個mechinism(即IoC容器)在需要時,以選擇正確的具體實現IProviderRepository的。例如,如果我正在處理一位我知道是個人的提供者,那麼我可以獲得PersonRepository實現。

另一種選擇是不實施任何IProvider存儲庫,只是堅持使用'Person'和'Business'存儲庫並在服務層中按照需要使用它們?

回答

0

我想你已經在想這件事了,而且你正試圖儘早優化。

從你在這裏所說的一切,聽起來像人和商業都是實體,但既不是聚合(雖然很明顯,我可能會在你的討論區域專家中缺少某些東西)。在我看來,提供者是聚合。

當您構建ProviderRepository時,您不需要爲Business and Nad Persons注入存儲庫,如果它們不是聚合,則不需要它們自己的存儲庫。相反,ProviderRepository應該直接使用Session來獲取它所需的任何數據庫模式所需的內容,以便爲給定查詢組合所討論的實體。如果您正確映射繼承,則可以在基類或接口上執行查詢。

+0

感謝您的評論保羅。就我而言,業務實體將用於系統中,即使它不是提供者。例如,域用戶將維護系統中的業務記錄,此時這些業務記錄的一部分可能成爲供應商。 – watsite 2011-05-19 14:59:34

+0

我同意你的觀點,關於試圖優化得太早。在我的項目中,數據源很可能是雲服務,而不是域的一部分的數據庫,因此我無法利用nhibernates的'任何'功能來自動查找實現給定接口的所有實體;因此我開始考慮如何優化IProvider存儲庫如何找到數據來自何處的數據,即要檢查的類型。 – watsite 2011-05-19 15:09:41

+0

不夠公平,只要注意早期的優化陷阱。關於在系統中使用的商業實體而不是提供商,考慮有限上下文作爲思考的方式。 http://www.markhneedham.com/blog/2009/03/07/ddd-bounded-contexts/ – Paul 2011-05-19 15:37:59