我真的很感激人們對下面的設計問題的看法。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'存儲庫並在服務層中按照需要使用它們?
感謝您的評論保羅。就我而言,業務實體將用於系統中,即使它不是提供者。例如,域用戶將維護系統中的業務記錄,此時這些業務記錄的一部分可能成爲供應商。 – watsite 2011-05-19 14:59:34
我同意你的觀點,關於試圖優化得太早。在我的項目中,數據源很可能是雲服務,而不是域的一部分的數據庫,因此我無法利用nhibernates的'任何'功能來自動查找實現給定接口的所有實體;因此我開始考慮如何優化IProvider存儲庫如何找到數據來自何處的數據,即要檢查的類型。 – watsite 2011-05-19 15:09:41
不夠公平,只要注意早期的優化陷阱。關於在系統中使用的商業實體而不是提供商,考慮有限上下文作爲思考的方式。 http://www.markhneedham.com/blog/2009/03/07/ddd-bounded-contexts/ – Paul 2011-05-19 15:37:59