C#/Prism

[C# - Prism] 프리즘 예제 09 - ChangeConvention

반나무 2023. 7. 25. 23:06

안녕하세요, 반나무입니다.

지난 예제에서는 View와 ViewModel을 자동으로 연결했었는데요 이번 예제에서는 자동으로 연결되는 조건을 변경하는 방법을 안내합니다.

 

ChangeConvention 예제

// App.xaml.cs

public partial class App : PrismApplication
{
    protected override Window CreateShell() => Container.Resolve<MainWindow>();

    protected override void RegisterTypes(IContainerRegistry containerRegistry){}

    // View,ViewModel 자동연결 조건 변경
    protected override void ConfigureViewModelLocator()
    {
        base.ConfigureViewModelLocator();

        ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver((viewType) =>
        {
            var viewName = viewType.FullName;
            var viewAssemblyName = viewType.GetTypeInfo().Assembly.FullName;
            var viewModelName = $"{viewName}ViewModel, {viewAssemblyName}";
            return Type.GetType(viewModelName);
        });
    }

핵심 부분인 ConfigureViewModelLocator 함수를 자세히 살펴보겠습니다.

ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver((viewType) =>
{
    // view의 명
    var viewName = viewType.FullName;
    // view의 어셈블리명
    var viewAssemblyName = viewType.GetTypeInfo().Assembly.FullName;
    // viewModel의 명
    var viewModelName = $"{viewName}ViewModel, {viewAssemblyName}";
    return Type.GetType(viewModelName);
});

이 부분을 디버깅해보면 다음과 같습니다.

 

  • viewName = ViewModelLocator.Views.MainWindow
  • viewAssemblyName = ViewModelLocator, Version=1.0.0.0, Culture=neutral, PublickeyToken=null
  • viewModelName = ViewModelLocator.Views.MainWindowViewModel, ViewModelLocator, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

지난 예제와 이번 예제의 다른점이 여기 부분입니다.

지난 예제의 경우 ViewModels Namespace안에 들어가있어야지만 자동으로 연결 되었는데요

예제 8번 폴더 구조

이번 예제는 Views Namespace안에 들어가 있어야 자동으로 연결됩니다.

예제 9번 폴더 구조

 

8번 예제 자동 연결 구조

그렇다면 기존 예제는 어떤 구조로 자동으로 연결된건지 확인도 한번 해봐야겠죠?

SetDefaultViewTypeToViewModelTypeResolver 함수를 F12로 타고 들어가면 다음과 같은 부분이 나옵니다.

summary부분을 해석하면 다음과 같습니다.

ViewModel 유형 확인기의 기본 뷰 유형 확인기는 ViewModel이 View 유형과 동일한 어셈블리에 있지만 "ViewModels" 네임스페이스에 있다고 가정합니다.
viewName.Replace(".Views.", ".ViewModels.");

이 코드 때문에 ViewModels 네임스페이스를 사용해야했던겁니다.

 

suffix : MainWindow가아니라 MainView라면?

코드를 자세히 보다보니 suffix 부분이 있습니다.

어떤 View가 View로 끝나면 Model / View로 끝나지 않으면 ViewModel이 되네요

그렇기 때문에 MainWindow는 MainWindowViewModel을 자동으로 연결합니다.

만일 MainWindow를 MainView로 변경한다면 어떨까요?

MainWindow -> MainView

MainWindowViewModel을 MainViewModel로 변경시 View와 ViewModel이 자동으로 잘 연결되는것을 확인 할 수 있습니다.

정상적으로 View와 ViewModel이 연결되어 Title이 보이는 모습


viewModelName 부분을 자유롭게 변경해 사용자가 원하는 폴더 구조에서 View와 ViewModel을 자동으로 연결 할 수 있게  해주는 좋은 기능인것 같습니다.

반응형