2

我有一个遗留的 asp.net Web 应用程序,它有 2 层,UI 和 BusinessLayer。UI项目是ASP.NET网站类型,BL是类库类型。BL 项目为我的应用程序的实体提供类,如客户、用户、员工等。每个类都有从数据库读取和从 DataReader 填充对象属性的方法。这意味着客户类包含我的客户对象和数据访问方法.

现在我也更改了 Web 应用程序以支持 MVC。旧网站(webforms)像以前一样工作,我正在制作的网站的新升级(添加管理功能来管理网站)在 ASP.NET MVC3 中。路由和一切正常。但我担心项目的结构/可维护性。

对于新的 MVC 部分,我必须为 CustomerViewModel、EmployeeViewModel 等少数实体创建 ViewModel。我创建了另一个名为“ CustomerService”的类,使用类似的方法GetCustomerViewModel,在该方法内部,我GetCustomerMethod从现有的 BusinessLayer 调用并从对象(现有 BL 项目中提到的实体类型)读取属性值并将其分配给CustomerViewModel(我将研究一些AutoMapper 稍后会为这个对象采样并从这个方法中返回它。我的视图将使用此对象在 UI 中显示数据。我创建“ CustomerService”类的原因是,在将值设置为 CustomerViewModel 对象之前,我可能需要进行一些条件检查或一些业务验证。我认为这是一个“中间层/服务层”,这样我的控制器就会很薄。

从我的客户控制器

public ActionResult Details(int id)
{

   MyProject.MVCViewModel.CustomerViewModel objCustomerVM;
   objCustomerVM=MyProject.MVCMiddleLayer.CustomerService.GetCustomerViewModel(id);

   return View(objCustomerVM); 
}

在我的 CustomerViewModel

 public static CustomerViewModel GetCustomerViewModel(int customerId)
    {
       //Create an object of new ViewModel
       CustomerViewModel objCustomerViewModel  = new CustomerViewModel ();

       //Get an object from Existing BL of Customer of type ExistingBL.Customer
       ExistingBL.Customer objCustOld=new Customer(customerId); 

        //Check some properties of the customer object and set values to the new ViewModel object
          if(objCustOld.Type=="normal")
          {
            objCustomerViewModel.Priority=2; 
          }
          else if(objCustOld.Type=="abnormal")
          {
            objCustomerViewModel.Priority=1;
            objCustomerViewModel.Message ="We love you";
          }
         //Some other checking like this....
    return objCustomerViewModel;
   }

这是一个错误的方法吗?我的代码会乱吗?我对 ViewModel 不满意,因为它(几乎)是我现有 BL 实体的重复代码。解决这种情况的最佳方法是什么。我不确定在这种情况下是否使用存储库模式(我在大多数示例中都看到了)?我应该这样做吗?它将如何改进我的代码?

4

2 回答 2

0

我的 ViewModel 类或多或少是对仅具有属性的属性的重新定义,有人可能会争辩说这只是另一个开销层,但我这样做的原因很简单:我可以添加适当的 Web Validation 的属性而不会破坏任何东西(DataLayer 应该是可与其他应用程序共享)。

简而言之,给定一个暴露用户对象的 DataLayer 类:

public class DalUser {
  public int Id { get; set;}
  public int Age { get; set;}
  public string Name { get; set;}
  public string Surname { get; set;}

  // Business method for reading/writing/deleting

}

我的视图模型是这样的:

public class VmUser : DalUser 
{
   [Display(Name="ID Code")]
   public override int Id { get; set; }

   [Display(Name="Age")]
   [Required]
   public override int Age { get; set; }

}

这使我有两个目标:前者是我可以使用属性而不用担心破坏其他东西,后者是我可以向用户隐藏某些字段,防止字段注入(例如来自 FireBug - 但这包括定义一个接口并使用它,不是简单的子类化)。

这在我的公司中被证明是非常有用的(我们注定要使用 EntitySpaces),这是我发现的一种不那么丑陋的方式,可以部分重用 ES 生成的类。

于 2011-12-23T09:08:40.720 回答
0

我将采用的方法类似于存储库模式。我将概述几个关键点

  1. 因为您唯一需要重写的是 UI 逻辑(视图模型对象),并且由于您的 UI 技术不同(asp.net 与 MVC),所以它很好

  2. 我建议您开始研究接口,以便稍后您可以进行依赖注入。我通常在 mvc 中使用依赖注入的最大好处是在编写 NUnit 测试用例时。

public static ICustomerViewModel GetCustomerViewModel(int customerId) { //使用 DI,而不是具体实现 ICustomerViewModel objCustomerViewModel = new CustomerViewModel ();

   //use DI, rather than concerete implementation
   ExistingBL.ICustomer objCustOld=new Customer(customerId); 
   .
   .
   .
return objCustomerViewModel;

}

您现在可以在任何模拟框架的帮助下非常轻松地创建模拟对象。

于 2011-12-23T05:01:17.587 回答