2016-11-10 73 views
1

我想在ASP.NET MVC項目中使用三層體系結構和存儲庫模式。但在某些情況下,三層體系結構和存儲庫模式看起來幾乎相同。於是,我就研究以下,使之更加明確:三層體系結構與存儲庫模式

The Repository Pattern

N-Tier Architecture

在那之後,我已經進入下面的代碼執行和所期望的一些建議,以改善實施一個更有效的方式:

模式 - Department類:

public class Department 
{ 
    public int DepartmentID { get; set; } 
    public string Code { get; set; } 
    public string DepartmentName { get; set; } 
} 

接口 - IRepository接口:

public interface IRepository 
{ 
    public int Add(Student aStudent); //For Adding Students 
    public int Add(Department aDepartment); //For Adding Departments 
} 

DAL - DepartmentGateway類:

public class DepartmentGateway : IRepository 
{ 
    /****Repository Pattern - Starts****/ 
    Gateway aGateway = new Gateway(); 
    public int Add(Department aDepartment) 
    { 
     aGateway.Query = "INSERT INTO Departments (Code, Name) VALUES (@Code, @Name)"; 

     aGateway.Command = new SqlCommand(aGateway.Query, aGateway.Connection); 

     aGateway.Connection.Open(); 

     aGateway.Command.Parameters.Clear(); 
     aGateway.Command.Parameters.Add("Code", SqlDbType.NVarChar); 
     aGateway.Command.Parameters["Code"].Value = aDepartment.Code; 
     aGateway.Command.Parameters.Add("Name", SqlDbType.NVarChar); 
     aGateway.Command.Parameters["Name"].Value = aDepartment.DepartmentName; 

     int rowAffected = aGateway.Command.ExecuteNonQuery(); 

     aGateway.Connection.Close(); 

     return rowAffected; 
    } 
    /****Repository Pattern - Ends****/ 
} 

BLL - DepartmentManager類:

public class DepartmentManager 
{ 
    DepartmentGateway aDepartmentGateway = new DepartmentGateway(); 

    public int Add(Department aDepartment) 
    { 
     int affect = aDepartmentGateway.Add(aDepartment); 

     if (affect > 0) 
     { 
     return 1; 
     } 
     else 
     { 
     return 0; 
     } 
    } 
} 

我要離開UI部分。我正試圖確保這是否是繼續並讓我知道的正確方法。謝謝。

注意:我道歉問這個問題。實際上,我將這兩件事情混合在一起,並期望來自具有代碼示例的專家的一些建議。請不要發佈任何鏈接。我已經看到了一些。

+0

你不使用ORM嗎? –

+0

你好@Div!暫時沒有。它處於測試模式,稍後將遷移到ORM。 –

回答

3

N層和存儲庫模式並不矛盾。事實上,他們真的沒有任何關係。 N層只是您的應用程序應該分層構建的一種理念。這基本上是關於模塊化。存儲庫模式是關於抽象的,即從應用程序代碼中提取SQL查詢。您可以在同一個應用程序中很好地執行這兩個

但是,存儲庫模式存在很多爭議。它早於ORM,並且有一個強有力的論據可以使它在ORM中是多餘的。例如,使用實體框架,DbContext是您的工作單位,並且每個DbSet都是存儲庫。這裏你應該利用的是一個真正的戰略模式。您需要一些代表您的數據訪問的接口,並且稍後將使用實現(您的ORM)填寫它。儘管如此,這並不影響你的代碼,所以它主要是語義。請記住,您可能實際上並不需要「存儲庫」,並且您絕對不應該構建您的應用程序,就好像您將爲每個實體或類似的應用程序一樣。

+0

那麼你的意思是使用ORM來實現存儲庫模式?戰略模式看起來像一個新的。沒關係。最後一個問題 - 我的上面的代碼是否對存儲庫模式有所不同或完美?只是想確定。 –

+0

不,我是說一個ORM滿足存儲庫模式。戰略模式僅僅是一種抽象,它允許你爲一個功能塊分配不同的「策略」。換句話說,你可以利用這個接口的接口和代碼。稍後您可以注入該接口的實現。例如,在這種情況下,您可以擁有一個實體框架實現,一個Web Api實現等。您的所有應用程序都知道它正在調用接口上的方法。在實現中,您決定如何檢索數據。 –

+0

它實際上是一個倒退開始你的應用程序* *不使用ORM。具有諷刺意味的是,你可能應該有一個工作單元和一個或多個存儲庫*,這取決於你當前獲取數據的方式*。這是因爲你會希望將所有這些邏輯封裝在應用程序代碼的某個地方。但是,只要您引入ORM,那就沒有必要了。 –