我在實體框架中有兩個實體。現在我想通過將DAL實體的接口放入域來分離它們。實體框架中的接口(接口中的接口)
所以,最終的結果將是:
DAL
- 人:IPerson(EF實體)
- 書:IBOOK(EF實體)
域
- 接口(文件夾)
- IPerson
- 的iBook
- 人(域實體)
- 書(域實體)
現在的問題是,應該我Dal.Person有一個虛擬書或IBOOK ? 應該如何既DAL.Person,IPerson和Domain.Person樣子(給我公正的接口非常小的例子)
我在實體框架中有兩個實體。現在我想通過將DAL實體的接口放入域來分離它們。實體框架中的接口(接口中的接口)
所以,最終的結果將是:
DAL
域
現在的問題是,應該我Dal.Person有一個虛擬書或IBOOK ? 應該如何既DAL.Person,IPerson和Domain.Person樣子(給我公正的接口非常小的例子)
EF不支持與接口的工作,所以你不能有public virtual IBook ...
在Person
實體,如果你希望將其用作EF處理的導航屬性。
然後,刪除實體框架和域類之間的依賴關係的正確方法是什麼? – Julian 2012-03-12 11:42:10
使用POCO類。 – 2012-03-12 11:45:22
您的問題的答案完全取決於您的目標。
如果您正在創建域級接口,並且您可能(在某個階段之後)將DAL從實體框架交換到完全不同的(例如第三方Web服務或可能是xml序列化)的DAL上 - 那麼您將致力於完全分離Domain和DAL之間的任何具體邏輯。
如果可能的話,你希望你的域對域的entites /接口和你的DAL操作上DAL實體/接口操作,同時實現在數據訪問
因此指定的接口,你的DAL對象DAL。 Person應該包含一個Book對象,並在域級執行IPerson接口。
我會給所要求的一些例子:
#region Domain Objects
public interface IPerson
{
List<IBook> Books { get; private set; }
}
public interface IBook
{
string Name { get; private set; }
}
#endregion
#region DAL/Entity Framework Auto Generated classes
public class Person : IPerson
{
public List<Book> Books {get; private set;}
}
public class Book : IBook
{
public string Name { get; private set; }
}
#endregion
相反Jodrells評論,我想,如果有一個要求,「熱插拔」的數據訪問層有可能是對的情況下, DataAccess層實現Domain層中描述的接口契約。老實說,我很少見到這個要求 - 通常你最好是擴展自動生成的實體框架類(通過partial
)並傳遞應用程序,消除需要的重複通過指定域對象和契約本身。 所以實質上,你的實體框架類變爲你的域層的。
而且我要指出,你應該使用POCO類按上述評論
我從來沒見過使用的接口去耦EF。我知道它們被用於依賴注入的去耦,但也許EF在後臺會進行太多的工作(動態代理,更改檢測)。
我建議實施一個存儲庫層。
步驟1
從最簡單的圖案 - 在一個DAL層域和EF,模型(Person和書)使用代碼的標準EF過程首先。 EF在DbSet<Person>
和DbSet<Book>
中實現了存儲庫功能(但當然這種類型的存儲庫已鎖定到EF中)。
使可交付的應用程序適用於這種模式,您可以很快演示功能。這使您可以專注於應用邏輯,而不用擔心持久性問題。
步驟2
將域和DAL之間的存儲庫的類。將域調用替換爲DbSet<Person>
和DbSet<Book>
,並調用存儲庫中的IQueryable<Person>
和IQueryable<Book>
。資源庫集合最初只指向EF DbSet<>
集合。
在存儲庫中實現Save()。最初,它只是調用DbContext.SaveChanges()。
檢查功能是否保持不變。
步驟3
更換庫的IQueryable<>
的與無論是在新的DAL相當於源。這可能會也可能不會很棘手,具體取決於新DAL的形狀。
我遵循這種流程 - 從一個XML序列化的DAL開始,將它移至EF,將一個表重構爲本地XML文件,然後下一步將重構另一個表到ESB上的Web服務。
BTW,您提到用性能替換EF與SQL。我們發現EF緩慢批量插入,因爲它使用了逐行的樣式。
要解決這個問題,我基於EF倉庫(而不是大規模更換EF的具有其他功能,我們真的很喜歡)內實現使用SqlBulkCopy。這很快,但需要一段時間拼湊在一起。
我一直對AGES有這個問題。
在過去,我用AutoMapper使用過DTO,但這看起來並不是很優雅,但我認爲我找到了一個稍微整潔的方式 - 看看它是否適合您的設計。
基本上你公開兩個鏈接在你 - 在你的具體類 - 一個implemetents iBook的書和一個實現圖書BookNavigation
第一個實現了接口的要求(IBOOK),第二個實現的具體類讓EF快樂。然後,您將這兩個綁定到相同的私人書籍的相同。
我在這裏更詳細解釋一下:
http://bretthargreaves.wordpress.com/2014/11/11/entity-framework-and-interface-issues/
我不認爲應該DAL實現Domain接口。 – Jodrell 2012-03-12 11:08:26
@Jodrell http://dotnetslackers.com/articles/aspnet/Building-a-StackOverflow-inspired-Knowledge-Exchange-Three-Tiers-to-MVC-Hooray-Reversing-Dependencies.aspx說你應該刪除依賴關係到EF/L2SQL – Julian 2012-03-12 11:33:49
域是BLL還是模型? – Jodrell 2012-03-12 11:37:54