3

2 개의 먼 관련 도메인 모델을 운이없는 하나의 뷰 모델로 결합하는 방법을 찾고 있습니다.MVC 멀리 떨어져있는 여러 도메인 모델에서 뷰 모델 만들기

기존 응용 프로그램에서 작업 중이며 팩스 로그 검색 결과에 필드를 추가해야합니다. 컨트롤러가 viewModel을 반환하고 있는데, 추가 필드를 추가하려고합니다. 어떤 소리가 들리겠습니까?

배경 정보 :

이 원래 뷰 모델입니다 :

public string CustomerName { get; set; } 

방법을 응용 프로그램입니다 :

public class VOEIFaxLogSearchListViewModel 
{ 
    public DateTime DateTimeAdded { get; set; } 
    public string Processor { get; set; } 
    public string FaxStatusCode { get; set; } 
    public string VendorOrderID { get; set; } 
    public string FromFaxNumber { get; set; } 
} 

내가이 뷰 모델에 추가 필드를 추가 할 설계된 경우 저장 프로 시저가 호출되어 검색 결과의 데이터 집합을 반환합니다. 생성 된 데이터 세트는 다음의 DataTable로 변환된다

var resultFaxDS = vOEIDAO.GetFaxLogSearchResult(startDate,endDate,userName,faxType); 

(I는 필요한 검색 방법 (GetFaxLogSearchResult) 또는 SQL 콜 아니다되지 않으므로).

DataTable faxTable = resultFaxDS.Tables[0]; 

For 루프는 각 결과 레코드를 중개하여 FaxModel이라는 도메인 모델에 넣습니다. 어느 것이 자동 매핑으로 FaxLogSearchListViewModel이라는 viewModel에 매핑됩니다.

1) 뷰 모델에 새로운 속성을 추가 : 여기

for (int i=0; i<faxTable.Rows.Count;i++) 
      { 
       var row = faxTable.Rows[i]; 
       var faxLogModel = vOEIDAO.DRToFaxModel(row); 

       faxViewModel.Add(Mapper.Map<FaxModel,FaxLogSearchListViewModel>(faxLogModel)); 
      } 
     } 

    return faxViewModel; 
    } 

내가이 결과 필드를 추가하는 지금까지 한 일이다.

가 세트에서 CUSTOMERNAME를 반환하도록 검색 결과를 다시 끌어 2) 개질 된 프로 시저

이 딜레마 :

도메인 모델에 데이터 세트의 각 행을 첨가하는 방법 (DRToFaxModel) 도메인 모델 (FaxModel)을 채우고 있습니다. 추가하려는 필드가 도메인 모델에 없습니다. 결과적으로 구체적인 클래스에 속하지 않는 도메인 모델에 필드를 추가하고 싶지 않습니다.

public class FaxModel 
    { 
    public int FaxID { get; set; } 
    public int FaxStatusID { get; set; } 
    public string ToFaxNumber { get; set; } 
    public string FromFaxNumber { get; set; } 
    public DateTime DateTimeAdded { get; set; } 
    public string FaxStatusCode { get; set; } 
    public string Processor { get; set; } 
    public string VendorOrderID { get; set; } 
    } 

public FaxModel DRToFaxModel(DataRow dr) 
    { 
     FaxModel voObj = new FaxModel(); 

     voObj.FaxID = GetVOInt(dr["FaxID"]); 
     voObj.FaxStatusID = GetVOSmallInt(dr["FaxStatusID"]); 
     voObj.ToFaxNumber = GetVOStr(dr["ToFaxNumber"]); 
     voObj.FromFaxNumber = GetVOStr(dr["FromFaxNumber"]); 
     voObj.DateTimeAdded = GetVODateTime(dr["DateTimeAdded"]); 
     voObj.FaxStatusCode = GetVOStr(dr["FaxStatusCode"]); 
     voObj.Processor = GetVOStr(dr["Processor"]); 
     voObj.VendorOrderID = GetVOStr(dr["VendorOrderID"]); 
     //Cant add CustomerName to the model without modifying the FaxModel domain model. 
     //Shouldn't do that because it is a domain model. 
     //CustomerName is in the CustomerModel domain Model 
     // voObj.CustomerName = GetVOStr(dr["CustomerName"]); 

     return voObj; 
    } 

그래서 현재, 추가 CUSTOMERNAME 속성 내 뷰 모델이 CUSTOMERNAME에 대한 널 (null)로 반환됩니다 여기

도메인 모델과 검색 결과에서 각 행과 이식에 사용 된 방법이다.

내 도메인 모델은 서로 관련이 있습니다. 데이터베이스에서 FAX 테이블은 ORDER 테이블을 통해서만 연결하여 CUSTOMER 테이블에 조인 할 수 있습니다. FAX 테이블에 orderID 필드가 있고 ORDER 테이블에 CustomerID 필드가 있습니다.

내 질문은 다음과 같습니다. 어떻게 2 도메인이 없기 때문에 autoMapper를 사용하여 팩스 도메인 모델을 고객 도메인 모델에 매핑합니까? 다른 테이블을 통해 합류하지 않고 관계를 구축하기위한 공통 필드가 있습니까?

또는 automapper를 사용하여 2 개 이상의 테이블을 하나의 viewModel에 매핑 할 수 있습니까? 어떻게 된거 야?

답변

2

좋은 질문 이네. 무엇보다 먼저 누군가가 적절한 방법을 묻는 것을보고 기분이 상쾌합니다. 빠른 수정을 찾는 것입니다. 둘째, 제공되는 문서의 양은 정확히 SO 문항을 작성해야하는 방식입니다. 나는 +1 이상을 줄 수 있었으면 좋겠다.

그렇다면 본질적으로 아키텍처 질문을하기 때문에 구체적인 답변이나 정당한 의견은 없습니다.

var resultFaxDS = vOEIDAO.GetFaxLogSearchResult(startDate,endDate,userName,faxType); 

그러나, 당신이 당신의 sproc에 복귀 필드, CustomerName을 추가했습니다되지 않습니다 : 당신은 SPROC의 결과가 도메인 모델에 매핑 된 상태

: 여기

제 생각입니다 도메인 모델의 일부 그게 너의 문제의 핵심이라고 생각해.

여기에 선택해야 할 것이 있습니다 :이 sproc은 도메인 모델을 반환합니까 아니면 그렇지 않습니까?

지금 당장은 새 필드로 인해 더 이상 도메인 모델을 나타내지 않으므로 도메인 모델에 맵핑하지 말고 뷰 모델에 매핑해야합니다. sproc에서 실제로 얻은 결과를 나타내는이 결과를 매핑 할 새 데이터 유형을 만들고 을 뷰 모델에 매핑해야합니다.

대체 옵션은이 sproc가 실제로 도메인 모델을 나타내는 것입니다. 이 경우 모델의 일부가 아닌 새 필드를 추가해서는 안됩니다. 대신 FaxModel 도메인 객체와 CustomerModel 도메인 객체를 따로 가져와 두 객체의보기 모델을 조합해야합니다.

는 객체, 기능, 조립, 도대체, 심지어 프로그램, 하나 목적이 것을 의미하는 단일 책임 원칙의 예입니다. sproc에 도메인 모델이면서 도메인 모델이 아닌 리턴 값을 제공함으로써 하나 이상의 목적을 부여하게됩니다. 고객이 팩스 번호 FaxModel을 나타내는 것으로 판단하고 고객 이름을 다른 출처에서 가져와야하거나 고객 및 팩스 정보가 모두 포함 된 CustomerFaxModel 등의 다른 정보를 반환해야한다고 동의하는 것이 가장 좋습니다.

기술적 인 질문에 답하기 위해 AutoMapper를 사용하면 원본 개체 외에 기존 대상 개체를지도 기능에 전달할 수 있습니다. 객체 A의 타겟을 매핑하여 일부 필드를 얻은 다음 이미 매핑 된 타겟을 다른 필드를 매핑하는 객체 B 소스와 함께 Map()으로 두 번째로 전달할 수 있습니다.

언제나, 항상 이와 같은 질문을 계속하면 잘 할 수 있습니다.

관련 문제