2014-01-30 4 views
0

MVVM을 사용하는 wpf 응용 프로그램에서 Prism + Unity를 사용하고 있습니다. 저는 프리즘과 단결의 초보자입니다.Unity 생성자 삽입

현재보기를 닫을 수 있기를 원합니다. 필자가 읽은 다양한 솔루션과 기사는이 작업을 수행하는 가장 좋은 방법은 뷰 모델에서 나온 것이라고 설명합니다. 그러나보기 모델은보기를 닫으려면 지역 관리자 객체가 필요합니다. 자, 생성자 삽입을 설정해 보겠습니다. 전에 이것을 시도한 적이 없지만이 문제를 다루는 많은 질문이 있습니다.

어떻게 서로 연결되어 있는지 설명해 드리겠습니다. 유형 및 인스턴스 등록을 처리하는 부트 스트 래퍼 클래스가 있습니다. 여기

container.RegisterType<IViewModel, ViewAccountsViewModel>(new InjectionConstructor(new ResolvedParameter(typeof(RegionManager)))); 
container.RegisterType<ViewAccountsView>(); 

뷰에 대한 모듈보기 계정 : 내 ViewAccountsView.xaml에서

public class ViewAccountsModule : IModule 
{ 
    private readonly IRegionManager regionManager; 
    private readonly IUnityContainer container; 

    public ViewAccountsModule(IUnityContainer container, IRegionManager regionManager) 
    { 
     this.container = container; 
     this.regionManager = regionManager; 
    } 

    /// <summary> 
    /// 
    /// </summary> 
    public void Initialize() 
    { 
     regionManager.RegisterViewWithRegion("MainRegion",() => this.container.Resolve<ViewAccountsView>()); 
    } 
} 

, 나는 데이터를 설정하고 여기에

내 뷰와 뷰 모델을 등록하는 방법입니다 문맥과 같이 :

<Grid.DataContext> 
    <vm:ViewAccountsViewModel/> 
</Grid.DataContext> 

그리고 내보기 모델 생성자 :

[InjectionConstructor] 
public ViewAccountsViewModel(IRegionManager regionManager) 
{ 
    if (regionManager == null) throw new ArgumentNullException("regionManager"); 

    this.regionManager = regionManager; 
} 

솔루션을 컴파일 할 때 "ViewAccountsViewModel"유형에 액세스 가능한 생성자가 포함되어 있지 않다는 오류가 발생합니다. 내보기 모델에 기본 생성자를 추가하면보기가 표시되지만 해당 지역에서보기를 제거 할 수 없습니다. 나는 인자 null 예외를 얻는다. 아주 많이 나는 아직도 나는

regionManager.Regions["MainRegion"].Remove(regionManager.Regions["MainRegion"].GetView("ViewAccountsView")); 

IOC의와 DI와 초보자 : 여기

보기를 제거하기위한 코드입니다. 내가 놓친 것이 있습니까?

+0

는 기본 생성자를 추가하고이 constructor에에 브레이크 포인트를 넣어. 이 기능이 작동하면 (중단 점에서 중지) 등록에 문제가있는 것보다 우선합니다 (모든 등록 된 개체가 이미 등록되어있는 경우 모든 개체를 확인하십시오). –

+0

'container.RegisterType ();'으로 변경하면 추가하겠다는 생각이었습니다. 내보기가 표시되지만보기를 제거 할 수 없습니다. 오버로드 된 생성자가 호출되지 않습니다. –

답변

4

Unity는 당신이 알고있는 모든 의존성을 주입합니다. 기본적으로 Unity는 가장 많은 매개 변수를 사용하여 생성자를 호출합니다. 일반적으로 InjectionConstructor를 사용하여 객체를 생성 할 때 Unity 생성자에게 다른 생성자를 선택하도록 지시하거나 사용자 정의 매개 변수를 전달하려고합니다.

등록 :

container.RegisterType<IViewModel, ViewAccountsViewModel>(); 
// If you plan to have multiple IViewModels, it will need to have a name 
// container.RegisterType<IViewModel, ViewAccountsViewModel>("ViewAccountsViewModelName"); 
container.RegisterType<ViewAccountsView>(); 

뷰 모델 : 뒤에

// If you decide later you need other dependencies like IUnityContainer, you can just set 
// it in your constructor and Unity will give it to you automagically through the power 
// of Dependency Injection 
// public ViewAccountsViewModel(IRegionManager regionManager, IUnityContainer unityContainer) 
public ViewAccountsViewModel(IRegionManager regionManager) 
{ 
    this.regionManager = regionManager; 
} 

코드보기 :

// If you have a named IViewModel 
// public ViewAccountsView([Dependency("ViewAccountsViewModelName")]IViewModel viewModel) 
public ViewAccountsView(IViewModel viewModel) 
{ 
    this.InitializeComponent(); 
    this.DataContext = viewModel; 
} 
+0

답변 해 주셔서 감사합니다. 그것은 나를 위해 일했습니다. – Snesh