2016-11-12 5 views

답변

1

이 질문에 시작됩니다 내 창 /보기에서 새 창 /보기를 열 수있는 방법을 모든 디자인과 간단한 인젝터에 관한 것입니다 composition root 어딘가에 구현 세부 사항입니다.

다른 answer 여기에 stackoverflow Windows Forms 관한 유사한 질문을 썼습니다. 그 대답의 아이디어는 WPF에서 그다지 다르지 않습니다. - 기본 창 이외에 몇 개의 창이 필요합니까? - 다른 창은 다른 창으로 이동해야하거나 다른 창을 주 창에서만 열어야합니까? 창문 - 창문의 라이프 스타일은 무엇입니까? 그것은 일반적으로 매우 단단 응용 프로그램이 몇 가지 창으로 구성되어 있으며 윈도우 단지에 필요한 창을 넣어, 싱글 라이프 스타일을 가질 수있는 경우 응용 프로그램

  1. 의 전체 수명에 대한 진정한 단일 창을 만들 수 있도록이다 메인 윈도우의 생성자. 라이프 스타일이 싱글 톤이 될 수 없다면 윈도우 당 Func<T> 팩토리 메소드를 삽입 할 수 있습니다.
  2. 컴포지션 루트의 첫 번째 창이나 주 창 부분을 만듭니다. 컨테이너를 생성자 매개 변수로 넣고 다른 윈도우를 표시하기 전에 컨테이너에서 직접 확인하십시오. 이 경우이 창의 유일한 책임은 응용 프로그램 창을 열거 나 보여 주어야합니다.
  3. 완성 된 디자인 변경을 확인 Caliburn Micro 같은 MVVM 도구를 사용하여 구현과 INavigationService를 구성 루트
  4. 의도 부분을 작성하고 간단한 인젝터 컨테이너
  5. 에 직접 Caliburn 부트 스트 래퍼 클래스의 GetInstance() 방법을 재 ..

가능성 1, 2 및 4는 구현하기 쉽습니다. 가장 간단한 형태의 NavigationService도 매우 간단하고 같이 보일 것입니다 : 우리는 그러나이 다른 자세를 취하면

public class NavigationService : INavigationService 
{ 
    private readonly Container container; 

    public NavigationService(Container container) 
    { 
     this.container = container; 
    } 

    public void ShowView<TView>() where TView : Window 
    { 
     var view = this.CreateWindow<TView>(); 

     view.Show(); 
    } 

    public bool? ShowDialog<TView>() where TView : Window 
    { 
     var view = this.CreateWindow<TView>(); 

     return view.ShowDialog(); 
    } 

    private Window CreateWindow<TView>() where TView : Window 
    { 
     return this.container.GetInstance<TView>(); 
    } 
} 

, 우리는 디자인을 만들 수있는 처리를위한이 디자인의 UI 버전 본질적으로 commandsqueries. 이 패턴은 비즈니스 계층과 UI 측면 모두에서 실제로 문제를 해결합니다.

대부분의 LOB 응용 프로그램에서는 일반적으로 화면을 선택하여 선택 또는 선택을 허용하고 다른 부분은 사용자가 데이터를 입력하고이를 일부 데이터 저장소에 저장하는 화면입니다. 우리가 추상적 인 수준에서이 문제를 바라본다면 사용자가 상호 작용할 수 있도록 UI의 일부로 처리된다는 사실은 중요하지 않습니다. 우리는 단지 특정 서비스의 데이터를 쿼리하거나 편집하는 서비스라고 생각할 수 있습니다. 이것은 웹 서비스 일 수도 있지만 직접적인 사용자 일 수도 있습니다.몇 가지 간단한 인터페이스를 정의함으로써

, 그리고 우리가 이렇게 뷰 모델 구현을 만들 수 MVVM 디자인 패턴을 사용

public interface IEditViewModel<TEntity> 
{ 
    EditResult EditEntity(TEntity entityToEdit, DialogHandler dialogHandler); 
} 

public interface IChooseViewModel<TEntity> 
{ 
    TEntity ChooseEntity(DialogHandler dialogHandler); 
} 

public class ChooseEntityService 
{ 
    private readonly Container container; 
    private readonly DialogHandler dialogHandler; 

    public ChooseEntityService(Container container, DialogHandler dialogHandler) 
    { 
     this.container = container; 
     this.dialogHandler = dialogHandler; 
    } 

    public TEntity ChooseEntity<TEntity>() 
    { 
     var viewModel = this.container.GetInstance<IChooseViewModel<TEntity>>(); 
     return viewModel.ChooseEntity(this.dialogHandler); 
    } 
} 

우리가 ChooseService를 주입 고객을 선택할 필요로하는 창에서. 이 서비스는 올바른 구현을 찾고 DialogHandler은 좋아하는 MVVM 도구를 통해보기를 표시하는 구현입니다.

This answer이이 디자인에 대해 자세히 설명합니다.