2012-08-15 44 views
1

我想知道如果我所做的解決方案可以做得更聰明,以及我想是這樣。我的問題是我有一個類庫,保留了我的所有方法。然後我得到了我的MVC,我使用了一個模型。這兩種模式是相同的,但我需要轉換這些,而它的愚蠢。使用類庫和MVC模型

在我的課libary我使用實體框架,在那裏我得到自我生成的類。

在我的MVC模型類中,我創建了一個類,這樣我就可以使用正則表達式等等。

問題:當我想發回一個方法時,我經常只想發送從我的視圖返回的對象。我厭倦了創建一個對象的實例,然後這樣做:

[HttpPost] 
    public ActionResult CreateUser(UserModel user) 
    { 
     //my class libary/entity framework class for a user 
     User efUser = new User(); 
     efUser.Email = user.Email; 
     efUser.Username = user.Username; 
     efUser.Password = user.Password; 

     UserBLL userBLL = new UserBLL(); 

     //send the method to classlibary/logic layer 
     userBLL.CreateUser(efUser); 

     return RedirectToAction("Index"); 
    } 
+0

當你說正則表達式,所以這是爲了驗證目的? – 2012-08-15 22:46:13

+0

你是說你已經厭倦了將對象從類庫手動映射到mvc項目?你看過Automapper嗎? – 2012-08-16 01:05:46

+0

我認爲Automapper是關鍵字。 thx :) – Karsten 2012-08-16 13:31:57

回答

1

這是我發佈在類似問題上的東西!希望它能幫助您更好地理解在MVC中分層您的應用程序,並且您應該將BLL上的方法轉換爲非靜態方法,以便能夠有效地測試您的應用程序!

答:

從更高層次來看,當你考慮應用程序體系結構,即數據層,業務邏輯層和表示層,MVC應該只是你的表示層。我經常看到人們犯了一個錯誤,認爲在MVC中,模型表示它們的數據層,控制器表示業務邏輯層,視圖表示表示層。

您應該始終有一個單獨的業務邏輯層(或服務層),您的MVC控制器可以訪問該業務邏輯層來執行業務邏輯,並且還應該有一個單獨的數據訪問層(或存儲庫),只有您的服務/業務邏輯層從數據庫中檢索數據。

在典型的MVC應用程序中,可能有多個視圖模型表示同一個數據層對象(通常表示數據庫表)。例如,您可能有2種觀點來表示關於某人的信息;一個是摘要視圖,另一個是詳細視圖。在您的MVC應用程序中,您將擁有2個視圖模型,即PersonSummary和PersonDetail,這兩個視圖模型都是從數據層中的相同人員表中填充的,並在控制器調用方法(例如GetPersonSummary()和GetPersonDetails())時返回到Controller Action在PersonService類(業務邏輯層)上。

以這種方式分層您的應用程序將使它們比將視圖模型視爲數據模型並將所有業務邏輯寫入Controller操作中更具可維護性和可測試性。

+0

您是否建議從服務層(BL)返回ViewModels?這不會違反概念的分離嗎? (我沒有面對你,我只想知道更多。) – rcdmk 2013-05-18 23:06:42