2

난 2 레이어, UI 및 BusinessLayer가 레거시 asp.net 웹 응용 프로그램이 있습니다. UI 프로젝트 유형은 ASP.NET 웹 사이트이고 BL은 유형 클래스 라이브러리입니다. BL 프로젝트에는 Customer, User, Empoloyee 등의 응용 프로그램 엔터티를위한 클래스가 있습니다. 각 클래스에는 데이터베이스 읽기 및 DataReader에서 개체 속성 채우기 메서드가 있습니다. 즉, 고객 클래스에는 고객 개체와 데이터 액세스 메서드가 함께 포함됩니다. .기존의 BusinessLayer에서 ViewModel 객체를로드하는 더 나은 방법으로 BusinessLayer.Better와 함께 기존 ASP.NET 응용 프로그램에 ASP.NET MVC?

이제 MVC도 지원하도록 웹 응용 프로그램을 변경했습니다. 이전 사이트 (webforms)는 이전 버전과 마찬가지로 작동하며 사이트를 관리하기위한 관리 기능을 추가하는 사이트로의 새 업그레이드는 ASP.NET MVC3에 있습니다. 라우팅과 모든 것이 잘 작동합니다. 그러나 나는 프로젝트의 구조/유지 가능성에 대해 걱정하고있다.

새 MVC 부분에서는 CustomerViewModel, EmployeeViewModel과 같은 몇몇 엔터티에 대해 ViewModels을 만들어야했습니다. "CustomerService"이라는 메서드를 사용하여 GetCustomerViewModel 같은 메서드를 만들고 그 메서드 안에는 기존 BusinessLayer에서 GetCustomerMethod을 호출하고 기존 BL 프로젝트에 언급 된 개체 유형의 개체에서 속성 값을 읽고 CustomerViewModel (I 나중에이 AutoMapper 샘플을 살펴보고이 메서드에서 반환합니다. 내보기는이 개체를 사용하여 UI에 데이터를 표시합니다. "CustomerService"클래스를 만든 이유는 조건 확인 또는 일부 비즈니스 유효성 검사를 수행하기 전에 값을 CustomerViewModel 개체로 설정하기 전에 수행해야 할 수도 있습니다. 내 컨트롤러가 얇아 질 수 있도록 "중간 계층/서비스 계층"으로 간주합니다. 내 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; 
    } 

에서 내 고객 컨트롤러

public ActionResult Details(int id) 
{ 

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

    return View(objCustomerVM); 
} 

에서

이 잘못된 접근 방식인가? 내 코드가 지저분해질 것인가? ViewModel에 대해서는 만족스럽지 않습니다. 기존 BL 엔티티의 중복 코드이기 때문입니다. 이 시나리오를 해결하는 가장 좋은 방법은 무엇입니까? 나는이 경우 대부분의 예제에서 보았던 저장소 패턴 사용에 대해 확신하지 못합니까? 어떻게해야합니까? 내 코드를 어떻게 개선할까요?

+0

항상 링크를 붙여 넣기는 싫지만 유용한 정보가 있습니다. http://stackoverflow.com/questions/5306655/using-view-models-in-asp-net-mvc-3 –

답변

0

내가 취할 접근법은 저장소 패턴과 유사합니다. 나는 몇 가지 주요 포인트

당신이 UI 로직 (보기 모델 개체), 그리고 UI 기술로는 잘 될 것입니다 재 작성 될 수있는 유일한 일이 다르기 때문에
  1. (MVC 대 asp.net)를 개설 할

  2. 나중에 인터페이스에 대한 작업을 시작하여 나중에 종속성 주입을 수행 할 것을 제안합니다. 내가 일반적으로 mvc에서 의존적 인 주입을 할 때 가장 큰 이득은 NUnit 테스트 케이스를 작성하는 동안이다.

공공 정적 ICustomerViewModel GetCustomerViewModel { //이 DI보다는 concerete 구현 ICustomerViewModel objCustomerViewModel = 새 CustomerViewModel()를 사용 (고객 ID를를 INT);

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

}

이제 아주 쉽게 조롱 프레임 워크의 도움으로 모의 객체를 생성 할 수 있습니다.

0

내 ViewModel 클래스가 속성 만있는 속성을 재정의 한 경우 다른 사람이 오버 헤드 레이어라고 주장 할 수도 있지만 간단한 이유만으로이 작업을 수행 할 수 있습니다. 아무 것도 만들지 않고 적절한 웹 유효성 검사의 특성을 추가 할 수 있습니다 (DataLayer는 다른 앱과 공유 할 수 있습니다.) 이 두 가지 목표에 날 리드

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

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

} 

:

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 

} 

내 뷰 모델은 같은 것이있다 : 전 내가없이 속성을 사용할 수 있습니다 반바지에

는 사용자 개체를 노출시키는 데이터 영역 클래스를 제공 후자는 뭔가 필드를 숨기고 필드 주입을 막을 수 있습니다 (예 : FireBug -하지만 인터페이스를 정의하고이를 사용하는 것이지 일반 서브 클래 싱이 아닙니다).

내 회사 (우리는 EntitySpaces를 사용하는 운명)에서 꽤 유용하다는 것을 입증했으며, ES 생성 클래스를 부분적으로 재사용하기 위해 내가 찾은 덜 못생긴 방법 중 하나입니다.