2012-03-12 45 views
2

我在實體框架中有兩個實體。現在我想通過將DAL實體的接口放入域來分離它們。實體框架中的接口(接口中的接口)

所以,最終的結果將是:

DAL

  • 人:IPerson(EF實體)
  • 書:IBOOK(EF實體)

  • 接口(文件夾)
    • IPerson
    • 的iBook
  • 人(域實體)
  • 書(域實體)

現在的問題是,應該我Dal.Person有一個虛擬書或IBOOK ? 應該如何既DAL.Person,IPerson和Domain.Person樣子(給我公正的接口非常小的例子)

+0

我不認爲應該DAL實現Domain接口。 – Jodrell 2012-03-12 11:08:26

+0

@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

+0

域是BLL還是模型? – Jodrell 2012-03-12 11:37:54

回答

1

EF不支持與接口的工作,所以你不能有public virtual IBook ...Person實體,如果你希望將其用作EF處理的導航屬性。

+0

然後,刪除實體框架和域類之間的依賴關係的正確方法是什麼? – Julian 2012-03-12 11:42:10

+2

使用POCO類。 – 2012-03-12 11:45:22

1

您的問題的答案完全取決於您的目標。

如果您正在創建域級接口,並且您可能(在某個階段之後)將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類按上述評論

+0

在我的niavety,我認爲這是這種情況 – Jodrell 2012-03-12 11:49:16

+0

@帕特里克麥克利感謝您的真正好評!雖然讓實體框架類成爲我的領域層是我的問題。該客戶希望首先快速實施Entity Framework以便快速開發。但後來他想用純SQL交換整個EF,所以它會更快。在旁註中,拉迪斯拉夫(其他評論)說,在EF中不可能使用接口。 – Julian 2012-03-12 11:49:58

1

我從來沒見過使用的接口去耦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。這很快,但需要一段時間拼湊在一起。

0

我一直對AGES有這個問題。

在過去,我用AutoMapper使用過DTO,但這看起來並不是很優雅,但我認爲我找到了一個稍微整潔的方式 - 看看它是否適合您的設計。

基本上你公開兩個鏈接在你 - 在你的具體類 - 一個implemetents iBook的書和一個實現圖書BookNavigation

第一個實現了接口的要求(IBOOK),第二個實現的具體類讓EF快樂。然後,您將這兩個綁定到相同的私人書籍的相同。

我在這裏更詳細解釋一下:

http://bretthargreaves.wordpress.com/2014/11/11/entity-framework-and-interface-issues/