2014-03-27 227 views
1

我只是完成使用Ninject依賴注入到我的asp.net網站API項目實施庫模式&工作單位。的ASP.NET Web API庫模式服務層(業務邏輯)

使用實體框架作爲我的ORM。

我有以下soluction結構(項目):

  • Web應用程序(asp.net網頁API)
  • 數據(的DbContext,資料庫)
  • 接口(IRepository等)
  • 模型(來自DB的POCO類)

例如我的PersonRepository(數據項目):

public class PersonsRepository : EFRepository<Person>, IPersonsRepository 
      { 
       public PersonsRepository(DbContext context) : base(context) { } 

       public IQueryable<Person> GetByAge(int age) 
       { 
        return DbSet.FirstOrDefault(ps => ps.age == age); 

       } 

    public void Delete(int personId, int age) 
      { 
       // Here I want to validate some stuff before deleting 
       // Business Rules need to be here!! 

       var attendance = new Attendance {PersonId = personId, Age = age}; 
       Delete(attendance); 
      } 

      } 

所以我的問題是,如果它的正確實施我的存儲庫方法中的所有業務邏輯?以及在需要的情況下返回消息或驗證的最佳方式是什麼。

謝謝,感謝任何幫助!

回答

1

不,它不是。存儲庫實現屬於持久性(DAL)。存儲庫涉及將業務對象轉換爲/來自用於將其存儲到數據庫中的任何形式。關心業務邏輯不是它的責任。業務邏輯保留在域中的業務層中。

商業邏輯是由域對象和服務包含。它永遠不會出現在業務層之外,不在UI(控制器)中,而不在DAL(存儲庫,EF等)中。

您正在使用的倉庫實現是不正確,反模式,因爲它違背了一個資料庫的目的:解耦從持久性細節的業務層(EF是一個實現細節)。存儲庫的接口不應該公開諸如IQueryable或EF實體之類的細節。它應該只知道關於業務對象的信息。

您的解決方案的結構是沒有意義對我說:你使用的所有接口應該是在他們所屬的層(庫接口是業務層的一部分,這就是爲什麼它不應該知道EF)。模型,基於你的描述似乎是持久性模型(它應該是數據的一部分)。

你想要一個業務(域)層,在那裏型號的真正意義的商業模式。不要與持久化模型(由EF使用),視圖模型(由View使用)或MVC中的M(由控制器使用)混淆:)。 MVC中的M表示業務模型的一部分,但與業務模型不同。

我建議把你的時間多讀一些關於存儲庫模式和3層架構,並確保你理解的概念和他們的目的。

+0

其實我參考了John Papa Code Camper項目:https:// github。com/johnpapa/CodeCamper 在我有的示例代碼中,該存儲庫模式是自定義存儲庫的自定義實現...因爲GetByAge方法只會被PersonRepo使用 – VAAA

+0

因此,您告訴我的是業務規則或邏輯(檢查某些字段是否正確,如果條件爲真或模型項目中的哪些內容(我擁有POCO類)? – VAAA

+1

業務邏輯應該停留在業務邏輯層,而不是數據訪問 – MikeSW

2

Data和Web之間應該有一個名爲Business的新層。 Web將僅引用業務層,業務層僅引用數據層。因此,在調用數據層之前或之後的業務層可以實現所有的驗證和業務邏輯。