2

我使用ADO.NET與MVC 5直接而不是實體框架。容易實現存儲庫模式

我指的是example來實現Repository Pattern。

對於一個簡單的實現庫模式:

  1. 我將創建一個模型
  2. 我將創建一個CRUD方法聲明的接口
  3. 我將創建數據訪問層類將實施上面的接口將會有CRUD方法實現

我想知道爲什麼使用Interface?按照上述第(3)點,我不能直接使用班級嗎?

接口的作用是什麼?

根據上面提到的三點,它是Repository Pattern的正確實現嗎?

+0

本系列將幫助您更好地理解它:http://imar.spaanjaars.com/573/aspnet-n-layered-applications-introduction-part-1 – Abhitalks

+0

一些原因包括 - 所以您可以單元測試您的應用程序,所以你可以注入你的倉庫到控制器(使用DI框架,如Ninject) –

+0

@StephenMuecke我沒有使用DI。你能說明答案如何使用DI注入?或提供任何鏈接。 – RKh

回答

2

在設計良好的代碼中,您必須使用接口,而不是實現。它有好處。想象一下,你有一個代碼片段的類:

IBookRepository bookRepository; 

public Book GetInterestingBook() { 
    var book = bookRepository.getBooks().FirstOrDefault(x => x.IsInteresting); 
    return book; 
} 

現在,我會告訴你一些好處:

  1. 使用界面允許您創建隱式的通過依賴注入(Ninject,團結bookRepository情況下,等等。其中有很多)。如果您決定將實體框架從實體框架更改爲NHibernate,則不需要對代碼進行更改。只需將映射文件中的映射更改爲用於IBookRepository NHibernateRepository而不是EFBookRepository。當然,NHibernateRepository也應該開發。

  2. 使用接口允許您通過MockObjects實現良好的單元測試。你只需要實現MockBookRepository並在注入時使用它。有很多Mock框架可以幫助你實現它 - 例如Moq。

  3. 您可以動態切換存儲庫,而無需更改您的代碼。例如,如果你的數據庫是臨時關閉的,但你有另一個可以處理新訂單的例子,例如它們很重要(壞例子,我知道)。在這種情況下,您檢測到數據庫宕機,並做出如下:

    currentRepository = temporaryOrdersOnlyRepository;

現在你的代碼繼續,除了你獲取數據運作和刪除方法返回異常,但CreateNewOrder()方法將保存訂單字符串文件)

祝你好運!

2

這裏是一個服務

public interface IFoodEstablishmentService 
{ 
    Task<int> AddAsync(FoodEstablishment oFoodEstablishment); 
    Task<int> UpdateAsync(FoodEstablishment oFoodEstablishment); 
} 

這是我的正常實施

public class FoodEstablishmentService : IFoodEstablishmentService 
{ 
    public async Task<int> AddAsync(FoodEstablishment oFoodEstablishment) 
    { 
     // Insert Operation 
     return result; 
    } 

    public async Task<int> UpdateAsync(FoodEstablishment oFoodEstablishment) 
    { 
     // Update Logic 
     return result; 
    } 
} 

這是我如何使用它

IFoodEstablishmentService oFoodEstablishmentService = new FoodEstablishmentService(); 
oFoodEstablishmentService.AddAsync(oFoodEstablishment); 

別急,如果我可能需要傳遞什麼我通過隊列而不是直接向服務器插入邏輯,等待插入操作完成,然後返回結果r ather傳遞隊列,然後隊列工作人員處理這些操作?的 所以不是搞亂了一切,我只是實現另一個類具有相同的接口

public class FoodEstablishmentQueueService : IFoodEstablishmentService 
{ 
    public async Task<int> AddAsync(FoodEstablishment oFoodEstablishment) 
    { 
     // Insert Queue Operation 
     return result; 
    } 

    public async Task<int> UpdateAsync(FoodEstablishment oFoodEstablishment) 
    { 
     // Update Queue Logic 
     return result; 
    } 
} 

這是我如何使用它,是不是很容易不破壞任何東西,並與DI容器對剛纔的答覆,甚至作品說明更好

IFoodEstablishmentService oFoodEstablishmentService = new FoodEstablishmentQueueService(); 
oFoodEstablishmentService.AddAsync(oFoodEstablishment); 

我想不選擇最佳模式,而任何開始,然後慢慢地你會需要更多的東西,然後圖案來除了庫模式或通用存儲庫模式發揮可能並不理想模式對於大規模應用而言,選擇邏輯不僅僅是選擇模型數據。請搜索CQRS模式。

1

該教程是相當無用的。這只是EF的DbSet的一個包裝。非常糟糕的例子。存儲庫模式本身意味着您需要根據域需求設計適當的界面。通常你至少需要3個:添加,獲取,保存。但一切都取決於你的域名,這很重要:沒有配方,這只是應用程序需要的。

存儲庫實現只是整個業務對象(其中業務對象是業務概念)的持久化/加載。你已經選擇了Ado.net(你應該選擇一個微Orm,因爲使用ado.net沒有任何好處)與db溝通。好吧,只需要保存到數據庫,查詢數據庫例程。

沒有關於如何實施存儲庫的配方/規則。 '硬'部分是設計界面。實現只是一個使用db的類(以任何你想要的方式)。

我們正在使用接口,因爲通常,回購界面是域的一部分,而其實現是持久性的一部分。這也允許多個存儲庫實現並且容易測試(通過模擬)。

順便說一句,你必須明白,存儲庫模式只是一個簡單的原則。它可以以你想要的方式實現,沒有一個「正確」的方法。但是,需要「正確」的是接口設計應該只使用業務對象,並且不應該泄漏實現細節(如IQueryable)。