2015-11-21 36 views
0

我想在域驅動設計項目中使用實體框架。在域驅動設計中抽象實體框架(如何避免IDbSet)

在我的理解中,Domain層應該對任何持久性實現一無所知。所以我有兩個接口 - IRepositoryIUnitOfWork。我在Data圖層中提供了實現。

我的問題是,我似乎無法找到避免在IRepositoryIUnitOfWork中使用實體框架IDbSet的方法。

我想問2個問題 - 我怎麼能從Domain層抽象實體框架?而且 - 如果我切換到NHibernate,我可以完全避免這個問題嗎?非常感謝。

+0

您可以使用IQueryable而不是IDbSet – CodeNotFound

+0

謝謝,我想過了,但後來我無法添加或插入數據。因爲我需要參考DbSet 。 – user11081980

+0

如果您在存儲庫方法推演中使用,您可以將其轉換回IDbSet。 – CodeNotFound

回答

1

在您的倉庫接口,定義查找方法,如

Task<MyAggregate> FindById(MyAggregateId id); 

和突變基因的方法,如

Task Update(MyAggregate aggregate); 

這清楚地表明瞭它的資料庫界面上使用域對象 - 封裝完成!

如果您以後切換到NHibernate,您需要在域和服務層中更改以下內容:Nothing

注意:Task<T>Task返回值僅在那裏,因爲存儲庫交互最好是異步實現的。如果你不需要/需要,你也不需要任務包裝器。

+0

非常好!我還補充說,**實現** repo接口的存儲庫類將與EF一起位於Infra/Data層,只是爲了讓其他可能讀取的人清楚。如果他切換到NHibernate,他只需更改存儲類代碼,而不用擔心域接口,就像您提到的那樣。 – Alisson