2013-07-05 149 views
5

工具:Mvc4,SQL SERVER,NHibernate的Mvc4:N層架構

我學習n層架構,並計劃用一個小例子來了解這一點。這將是一個學生註冊申請表,其格式爲 a。名字 b。姓氏 c。地址 d。學生證 應用程序將能夠 a。通過Id 獲得學生b。讓所有學生 c。註冊新生/保存學生 d。編輯學生 e。刪除學生

我計劃有下列各級

表示層(單獨的項目MVC 4應用程序)

--- HTML學生的形式放在這裏。我可以在這裏使用jquery等 ---我的控制器會調用服務

服務層(單獨的項目:類庫項目,在這種情況下只有web會成爲我的客戶端,我將學習如何使用webAPI或wcf這在另一個項目後)

--- StudentService這裏

--- IstudentService這裏

業務層:(單獨的項目:類庫項目) ?

數據層:(單獨項目:類庫項目) ??

數據庫(SQL Server數據庫)

現在我糊塗了,我的問題是:(?這層)

  1. 我哪裏會創造我的學生模型

  2. 什麼會我在我的業務層爲我有這個學生的例子寫作。

  3. 我的數據層會怎麼樣?我會寫哪些方法?他們是方法,將溝通 直接與數據庫?

    一些例子將是巨大的。我會尋找一個好的IOC容器。

這裏是下面的示例代碼:

public interface IStudentService 

    { 
     IEnumerable<Student> GetStudents(); 

     Student GetStudentById(int id); 

     void CreateStudent(Student student); 

     void UpdateStudent(Student student); 

     void DeleteStudent(int id); 

     void SaveStudent(); 
    } 

public class StudentService : IStudentService 
    { 
     private DataContext _datacontext; 
     public StudentService() 
     { 
      _datacontext = new DataContext(); 
     } 

     public IEnumerable<Student> GetStudents() 
     { 
      var students = _datacontext.Students; 
      return students; 
     } 

     public Student GetStudentById(int id) 
     { 
      return _datacontext.Students.Find(id); 
     } 

     public void CreateStudent(Student student) 
     { 
      _datacontext.Students.Add(student); 
      _datacontext.SaveChanges(); 
     } 

     public void UpdateStudent(Student student) 
     { 
      _datacontext.Entry(student).State = EntityState.Modified; 
      //_datacontext.Entry(student).State = EntityState.Modified; 
      _datacontext.SaveChanges(); 
     } 

     public void DeleteStudent(int id) 
     { 
      var student = _datacontext.Students.Find(id); 
      _datacontext.Entry(student).State = EntityState.Deleted; 
      _datacontext.SaveChanges(); 
     } 

     public void SaveStudent() 
     { 
      _datacontext.SaveChanges(); 
     } 
    } 

回答

1

你需要有Onion Architecture看看。它在MVC版本方面有點過時,但層級分層次很大。

在IoC容器我建議你找上Autofac方面 - 容易了很多功能使用,就像公約和多租戶登記。

至於你的問題:

我通常是在表單提交,控制器會得到StudentViewModel提交,然後我會把它轉換爲Student對象,並移交給IStudentRepository注入到控制器。而IStudentRepositry會將其保存到DBContext。存儲庫接口將位於域層,但存儲庫的實現將位於數據層。而DI容器將相互匹配。

這裏的訣竅是讓域層和實現中的所有接口都位於應有的位置。並且域層不應該依賴於任何其他層(讀取域項目不會引用數據和Web項目)。但Web將依賴於數據和域層。您只需要Web層中的數據層依賴性來配置IoC容器,因爲Web層是您的聚合根,並且應該在那裏配置IoC。但是,您不應該直接在任何操作中使用Data對象,您應該注入存儲庫或服務的接口。

關於分層體系結構已經有很多人說過了,所以先從Onion Architecture開始,然後你會更好地瞭解你需要什麼。

+0

我不知道洋蔥架構是有人剛開始學習,因爲各種物品往往承擔了很多知識是一件好事。我認爲在做傳統的分層三層之後,OA是一個很好的「第二步」。 –

+0

IoC容器被提及,所以我推定了一些知識水平。我記得自己學習這些東西。我做了一個正確的「經典」3層應用程序混亂。但是當我嘗試使用OA時,事情就在正確的地方,而且一切都很順利。 – trailmax

+1

是的,但它是你從「亂七八糟」,使得OA是有意義的,你學到了很多事實。如果您還沒有學習到OA所解決的問題,我認爲OA有很多「這麼做是因爲我這麼說」。 –

2
  1. 您可以在數據圖層中創建模型。您還將在您的表示層(用於您的視圖模型)中創建模型。您通常會在控制器中的數據模型和演示文稿模型之間進行某種映射。

  2. 簡單的應用程序通常並不需要業務層。特別是如果你的應用只是將表單中的數據保存到表格中然而,在一個應用程序,如這個你可能會做這樣的事情「你不能註冊這個類,除非你已經完成了類」或者你可能有「你已經註冊了多個類別比你被允許」還是什麼不。這些是必須在某處執行的業務規則,並且通常在業務層中。

  3. 您的數據層可能只是您的實體框架模型。這只是您的代碼來加載模型並將其保存到數據庫。

有很多IoC容器..我喜歡Ninject,但其他人喜歡其他的。它通常是個人喜好的問題。

以上是你將如何做一個簡單的應用程序。在更復雜的應用程序中,您也可以在業務層中使用模型。這一切都取決於應用程序的複雜性,以及您是否需要以不同於數據模型級別的業務級別表示數據。

例如,您可能在業務層中有一個業務對象列表,但出於性能原因,這些對象在數據層中的表示方式不同。但是,這一切都不是你現在應該擔心的事情。要明白,隨着應用程序變得越來越複雜,你可能需要以不同的方式做事。