2012-08-15 22 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