2010-06-28 92 views
1

任何人都可以告訴我他們如何實現使用功能導入時使用對EF 4.0存儲庫模式?使用實體框架4.0功能導入和存儲庫模式

我們有一個映射到候選實體的表格,還有一個映射到候選者的現有存根的功能導入。這在EF中非常適用,但我們通過使用存儲庫進行抽象,這些存儲庫採用其構造函數IObjectSet,其中T是POCO實體。但是這意味着我無法獲得對函數導入的引用。我能看到做這件事的唯一方法是將對ObjectContext的引用傳遞給需要它的存儲庫,但這對我來說有點像設計氣味。

即使我們的幾個存儲庫使用自定義接口進行擴展,我們仍面臨同樣的問題。

public class CandidateRepository : Repository<Candidate>, ICandidateRepository 
{ 
    public CandidateRepository(IObjectSet<Candidate> entities) 
     : base(entities) 
    { 
    } 

    public Candidate GetByEmail(string email) 
    { 
     return Entities.SingleOrDefault(c => c.EmailAddress.Equals(email)); 
    } 

    public bool CandidateExists(string candidateNumber) 
    { 
     return Entities.SingleOrDefault(c => c.Number.Equals(candidateNumber)) != null; 
    } 

    public Candidate GetByNumber(string number) 
    { 
     return Entities.SingleOrDefault(c => c.Number.Equals(number)); 
    } 

    public Candidate GetMember(string number) 
    { 

     return new Candidate(); //This one needs to return from the Function Import 
    } 
} 

任何建議非常感謝。

回答

1

要直接解決您的問題,您可以投entitiesObjectSet<T>並使用entites.Context屬性獲得ObjectContext

public Candidate GetMember(string number) 
{ 
    var objectSet = Enities as ObjectSet<Candidate>; 

    if(objectSet == null) throw new Exception("Oh, it's not EF IObjectSet implementation");   

    return objectSet.Context.MyCustomFunction(string number); 
} 

正如你可以看到這個代碼依賴於具體的實施IObjectSet這是不好的。

更好的想法是僅爲每個表創建聚合根的存儲庫。所以將ObjectContext傳遞給倉庫ctor會更自然。

+0

感謝您的反饋Yury。您是否會善意闡述您對「聚合根源」的定義?我們沒有進入開發階段,我們無法重構更好的可擴展性。 – 2010-06-29 14:54:56

+0

那麼,「聚合根」是域驅動設計(DDD)的概念。考慮一個簡單的Order 1 .. * OrderLine模型。通常情況下,您不會創建OrderLine,因此您只需要OrderRepository。因此Order是一個持有對OrderLines的引用的聚合根。 定義聚合根是一個實際的DDD問題,它取決於您試圖在應用程序中「建模」的對象。 – 2010-06-29 15:23:24

0

我已經走下了這條路線,並且我已經體會到,當您將ObjectContext的接口實現傳遞給您的存儲庫時,它不那麼痛苦。接口實現應該有一些調用函數的方法。所以當你傳遞ObjectContext的具體實現時,一切都應該正常工作。