2014-11-15 38 views
0

我正在使用EF代碼首先實現一個解決方案,其中存儲庫模式和工作單元執行正確的分離。我瘋狂地試圖找到正確的方法。EF代碼首先具有存儲庫和工作單元

所以我的解決辦法是這樣的:

  1. 數據訪問項目,我寫我的代碼第一類(Currenty我只有一個:Posts.cs),並寫了我的DbContext,Y也在這裏加入我所需要的其他類例如用於登錄,我將其標記爲[NotMapped](我知道...它沒有任何意義)

  2. 庫:我在哪裏工作實施

  3. 的Repository模式和單位WCF服務項目:在這裏我訪問該單元喜歡的工作:

    var posts= unitOfWork.PostRepository.Get() 
    

這裏一切都很好,但我可能需要這樣做:

unitOfWork.PostRepository.Insert(Post)  

現在去耦數據訪問前往市**,因爲我需要的一切的目的以引用DataAccess項目。

所以,幾個問題:

  1. 這是最好的方法,我怎麼能有一個模型分開?
  2. 我沒有業務層,像登錄到活動目錄的所有邏輯,它可以放在WCF項目中嗎?

請幫忙!!!

回答

0

你在這裏描述的問題讓我很難在幾年前得到我的頭。您肯定希望將數據訪問和業務邏輯分開,並且業務邏輯應該位於其自己的項目中,因此您需要做的是以存儲庫接口的形式創建抽象。喜歡的東西:

interface IPostRepository 
{ 
    void Insert(Post post); 
    void Update(Post post); 
    void Delete(int postId); 
    Post GetById(int postId); 
} 

此接口必須放在業務邏輯的項目,因爲你的業務邏輯需要能夠讀取和寫入數據。

在您的數據訪問層中,您實現了此接口,因此您需要從數據訪問層到業務邏輯的引用,但不是相反。

最後,您需要將接口和實現綁定在一起,這應該在WCF服務項目中完成,這意味着它具有對數據層和業務層的引用。有了這個設置,你可以有一個如下所示的WCF服務方法。

void InsertPost(Post post) 
{ 
    using (var db = new DbContext()) 
    { 
     var postRepository = new PostRepository(db); 
     var postService = new PostService(postRepository); 

     postService.Insert(post); 

     db.SaveChanges(); 
    } 
} 

現在看起來有點奇怪,因爲PostService似乎必須瞭解PostRepository。但PostService的構造是這樣的:

public PostService(IPostRepository postRepository) 
{ 
    _postRepository = postRepository; 
} 

PostRepository和PostService的例子中的人工建築上面很不理想。我真的建議你看看控制反轉容器,這使得大部分解耦和分層操作變得輕而易舉。有幾個在那裏:Autofac,Unity,Ninject等

+0

EF可以是存儲庫和UoF本身沒有任何額外的接口?這篇文章描述了在http://msdn.microsoft.com/en-us/data/dn314429上使用mock的方法。所以看起來EF已經在數據訪問和業務層之間提供了一些關注點。 – Artyom

+0

好吧,我自己並沒有多使用mock,但我不認爲他們改變了這樣一個事實,即您的業務邏輯應該不知道您的業務數據如何存儲。例如,您應該致力於能夠用另一種存儲類型(基於文件,其他數據庫等)替換EF,而無需更改業務層中的單行代碼。 –