2013-08-31 1 views
0

MVP (Passive View 및 EF (모델 우선))를 사용하여 응용 프로그램을 만듭니다. 내가 아는 한, 발표자는 EF를 통해 작성된 DataContext에서 직접 데이터를 가져 왔습니다. 그것은이 같은 같습니다 그래서 발표자가 모든 주문의 목록을 가져옵니다 MVP : 수동보기 (EF 사용) 및 레이어

 private void UpdateOrderTableControl() 
    { 
     IList<Order> orders = dataContext.Orders.ToList(); 
     IList<OrderViewModel> viewOrders = new List<OrderViewModel>(); 
     foreach (var o in orders) 
     { 
      viewOrders.Add(new OrderViewModel() 
      { 
       OrderId = o.Id, 
       CustomerId = o.CustomerId, 
       LastName = o.Address.LastName, 
       FirstName = o.Address.FirstName, 
       Company = o.Address.Company, 
       Weight = o.Weight, 
       Sum = o.Sum, 
       Date = o.Date 
      }); 
     } 

     view.GetOrderDataGridView().DataSource = viewOrders; 
    } 

은, (서로 다른 테이블에서 데이터를 결합, 위의 예 주소) 순서의 뷰 모델의 목록을 만듭니다 다음에 뷰 모델 목록을 보냅니다 전망.

그것의 거의 같은 일을 다른 방법으로 주위 순서대로 편집하거나 DB에 추가 할 뷰에서 데이터를 검색 할 때 :

 private void SaveOrder() 
    { 
     GetOrderDataFromView(); 

     if (isNewOrder) 
     { 
      dataContext.Orders.Add(selectedOrder); 
     } 
     else 
     { 
      dataContext.Entry(selectedOrder).State = EntityState.Modified; 
     } 

     dataContext.SaveChanges(); 
     isSaved = true; 

     UpdateOrderTableControl(); 
    } 

1) EF (특정 회사의 EF를 통해 만들어진 수 있으며, DataContext 등)을 DAL로 간주 할 수 있습니까? 자체 프로젝트에 있어야할까요?

2) 발표자가 DataContext에 대한 액세스 권한을 갖고 있으면 안되지만 둘 사이의 다른 레이어에 액세스해야한다고 생각하십니까? 그것이 서비스 계층, 비즈니스 계층 또는 둘 다 될 것입니까?

3) 내가보기 모델이라고 부르는 것은 실제로 뷰 모델입니까, 아니면 다른 것입니까? 나는 다만 나의 용어를 올바르게하고 싶다.

편집 :

4) 내가 EF에 의해 생성 된 개체에 비즈니스 로직을 추가하는 방법에 대한 몇 가지 제안을 읽을 수 있지만 나에게 꽤 괜찮 소리가 나지 않는다. EF 위에 별도의 비즈니스 계층에 비즈니스 개체를 만들어야합니까? 나는 Order (EF에 의해 생성됨), OrderBO (비즈니스 오브젝트) 및 OrderViewModel (표시 될 순서)을 가질 것임을의 L합니다. 다른 레이어를 추가 했으므로 맵핑을 더 많이해야하지만 프레젠터를 더 밝게 만들 것입니다. 사전에

감사합니다!

답변

1

좋은 질문!

글쎄, 그들 모두에 대한 대답은 당신이하고자하는 일에 초점을 맞추고 있습니다. 먼저해야 할 일은 각 패턴을 구현하는 데 필요한 노력이 고통의 가치가 있는지 평가하는 것입니다.

1) 양식의 구현간에 전환하거나 UI만으로 대규모 단위 테스트를 수행 할 예정입니까? 그렇다면 수동적 인 견해가 좋은 생각 인 것 같습니다.

2) 양식 안에 litle 코드가있는 것이 그리 고통스럽지 않습니까? 그런 다음 MVP supervising controller을 구현하는 것이 더 빠를 수 있습니다.

3) 프로그램 논리의 대부분은 비즈니스 계층 내부에있을 수 있습니까? BL 내부에있는 모든 로직을 가지고 나면, GUI에 특정한 로직이 얼마나됩니까? 그리 많지 않다면 GUI 패턴이없는 폼 안의 코드가 길이다. 질문에 대해

:

1) 예, EF는 DAL 간주 될 수 있으며, 다른 프로젝트에있을 다치게하지 않습니다. 여러분이 패턴을 작성했기 때문에 유용한 패턴은 Repository and Unit of Work Pattern이며 EF를 추상화하고 BL을 단위 테스트 할 수있게 해줍니다. (가짜 DAL 구현을 사용하여 실제 데이터베이스에 액세스하지 않고 테스트)

2). EF 객체는 POCO이므로 데이터 전송 객체로 간주 될 수 있습니다. DTO는 모든 레이어에서 볼 수 있습니다. 또 다른 전략은 주로 계층 응용 프로그램 (각기 다른 시스템의 각 계층)의 시나리오에서 계층 별 개체를 갖는 것입니다.

그렇지 않으면 강제로 EF 개체를 모든 레이어에서 볼 수 있지만 DataContext 자체는 GUI 레이어가 아닌 BL에서만 볼 수 있습니다. 즉, 쿼리와 트랜잭션은 BL로 수행되지만 GUI는 동일한 형식으로 결과를 가져올 수 있습니다.

3) 위의 조언을 따르는 경우 오히려 잘못된 개체 복사가 필요하지 않습니다.

4)이 전략은 Domain Model (google for more)입니다.이 전략에서는 로직을 도메인 객체 내에 배치하고 데이터베이스에도 액세스 할 수 있습니다. 다시 2)의 조언을 따르는 경우, 이것은 당신을 괴롭히지 않습니다.

패턴과 그 올바른 구현에 대해 좌절하기 전에 실제로 필요한 부분에 집중하십시오! 목표는 빠른 배송과 쉬운 유지 관리입니다. 추상화가 너무 많으면 두 가지 모두를 해칠 수 있습니다!

0

질문 2에 대해서는 데이터 액세스 레이어를 구분하고 추상화하는 것이 좋습니다. Presenter 내부에서 계속 유지하면 클라이언트가 매번 데이터베이스에 요청하고 일부 데이터를로드 한 다음 계산을 수행합니다. 클라이언트 - 서버 응용 프로그램에서 작업하는 경우 서버 논리와 클라이언트 논리가 섞이지 않는 것이 좋습니다. 발표자는 확실히 클라이언트 측, 서버 측 DAL입니다. 웹 서비스 (예 : asmx, wcf)를 사용하여 클라이언트와 서버를 연결할 수 있습니다. 필요한 경우 실제 백 엔드 서버 로직

  • 규모 서버 측 않고 발표자 간단한 단위 테스트를 작성하는

    1. 능력 : 나는이 작업을 수행하려면 적어도 세 가지 큰 이유를 참조하십시오.
    2. 당신이 수동보기 패턴으로, 서버 측

    에 관한 # 3에 대한 몇 가지 필요한 계산을 할 경우는 클라이언트에 적은 데이터를 보낼 수 있습니다, 데이터를 요청하는 발표자,이 (때로는라고 모델)을 선택하고 표시하고 렌더링 할보기로 보낼 준비를합니다. Model-View-ViewModel 패턴에서 ViewModel은 서버에 요청을 보내고 표시 할 데이터를 준비합니다. Presenter와 ViewModel이 View에서 작동하는 방식은 MVVM과 PassiveView의 차이점입니다. PassiveView Presenter에서 렌더링 할 데이터를 보낼 수있는 View의 인터페이스를 알 수 있습니다. MVVM View에서 ViewModel에 대해 알고 있고 ViewModel에서 데이터를 바인딩합니다.

    마지막 하나, # 1. 네, 인프라 스트럭처 레이어라고 생각합니다.여기에서 추상화를하면 몇 가지 최적화 명령을 이동하고로드 옵션을 설정할 수 있으며 (EF는 매우 유연합니다) 신속하게 수행 할 수 있습니다.

  • +0

    고맙습니다. 나는 또 다른 질문을 추가했다. – Lahey

    +0

    DDD (Domain Driven Design) 접근법에 대해 읽어 보시기 바랍니다. 대부분의 경우 비즈니스 로직은 비즈니스 규칙, 유효성 검증, 관계 등을 설명하는 별도의 계층입니다. –