안녕하세요, 반나무입니다.
이번 예제는 Module을 사용하는 5가지 방법에 대해 안내합니다.
- AppConfig
- Code
- Directory
- LoadManual
- Xaml
Module을 사용하는 방법을 알기 전에 Module이 뭔지 부터 알아야 사용을 할 수 있겠죠?
프리즘에서 정의한 Module은 프로젝트 단위의 서비스 또는 RegionContents라고 보시면 되겠습니다.
해당 모듈들은 프로젝트 단위로 구분되어있기 때문에 한번 제작해 두었을 때 여러곳에 사용 할 수 있으며, 유지보수가 쉽다는 장점이 있습니다.
저의 경우에는 프로젝트 단위의 거대한 서비스보단 클래스 단위의 작은 기능을 많이 사용하기 때문에 대부분 RegionContents를 Module로 만들어 사용합니다.
1. AppConfig
AppConfig방식은 App.config에 어떤 모듈을 사용할지 등록합니다.
처음 예제를 실행하면 ModuleA.dll이 없다고 예외가 발생합니다.
ModuleA를 빌드하면 ModuleA.dll이 만들어집니다.
해당 dll을 Module 폴더에 복붙하면 예제 확인이 가능합니다.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="modules" type="Prism.Modularity.ModulesConfigurationSection, Prism.Wpf" />
</configSections>
<startup>
</startup>
<modules>
<module assemblyFile="ModuleA.dll" moduleType="ModuleA.ModuleAModule, ModuleA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" moduleName="ModuleAModule" startupLoaded="True" />
</modules>
</configuration>
2. Code
제가 주로 사용하는 방법이며, 프로젝트를 참조하고 해당 모듈의 Module 클래스를 AddModule해줍니다.
public partial class App : PrismApplication
{
protected override Window CreateShell() => Container.Resolve<MainWindow>();
protected override void RegisterTypes(IContainerRegistry containerRegistry){ }
// 모듈 등록
protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{
moduleCatalog.AddModule<ModuleA.ModuleAModule>();
}
}
3. Directory
해당 예제는 경로로 Module을 등록하는데, 예제가 실행되지 않아 경로를 어떻게 잡아야할지 감이 오지 않습니다.
만약 사용 방법을 알 수 있다면. 경로에서 한번에 많은 모듈을 등록 할 수 있지않을까 생각됩니다.
public partial class App : PrismApplication
{
protected override Window CreateShell() => Container.Resolve<MainWindow>();
protected override void RegisterTypes(IContainerRegistry containerRegistry){ }
// 모듈 등록
protected override IModuleCatalog CreateModuleCatalog()
{
return new DirectoryModuleCatalog() { ModulePath = @"ModuleA" };
}
}
4. LoadManual
ModuleInfo 클래스를 직접 만들어 Module로 등록하는 방법입니다.
해당 방법은 너무 복잡해 굳이 쓸 일은 없다고 생각합니다.
public partial class App : PrismApplication
{
protected override Window CreateShell() => Container.Resolve<MainWindow>();
protected override void RegisterTypes(IContainerRegistry containerRegistry){ }
// 모듈 등록
protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{
var moduleAType = typeof(ModuleAModule);
moduleCatalog.AddModule(new ModuleInfo()
{
ModuleName = moduleAType.Name,
ModuleType = moduleAType.AssemblyQualifiedName,
InitializationMode = InitializationMode.OnDemand
});
}
}
5. Xaml
XamlModuleCatalog를 만들어 Module을 등록합니다.
Xaml을 하나 더 만들어줘야 하고 ModuleType을 입력해줘야하는 번거로움이 있어 사용하기엔 별로라고 생각합니다.
// App.xaml.cs
public partial class App : PrismApplication
{
protected override Window CreateShell() => Container.Resolve<MainWindow>();
protected override void RegisterTypes(IContainerRegistry containerRegistry){ }
// 모듈 등록
protected override IModuleCatalog CreateModuleCatalog()
{
return new XamlModuleCatalog(new Uri("/Modules;component/ModuleCatalog.xaml", UriKind.Relative));
}
}
<m:ModuleCatalog xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:m="clr-namespace:Prism.Modularity;assembly=Prism.Wpf">
<m:ModuleInfo ModuleName="ModuleAModule"
ModuleType="ModuleA.ModuleAModule, ModuleA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</m:ModuleCatalog>
IModule
모듈로 사용 할 프로젝트의 Module클래스는 IModule을 상속받습니다.
OnInitialized, RegisterTypes를 구현합니다.
저의 경우엔 생성자에서 IRegionManager를 필드로 받아 사용하는데, 예제에서는 멤버변수로 만들어 사용하는 다른 점 이 있습니다.
// ModuleAModule.cs
public class ModuleAModule : IModule
{
// IRegionManager를 사용한 Region에 View등록
public void OnInitialized(IContainerProvider containerProvider)
{
var regionManager = containerProvider.Resolve<IRegionManager>();
regionManager.RegisterViewWithRegion("ContentRegion", typeof(ViewA));
}
// container를 사용한 View와 ViewModel연결, 각종 클래스 등록
public void RegisterTypes(IContainerRegistry containerRegistry)
{
}
}
패키지 차이
모듈 예제를 보면 Shell과 Module의 패키지가 다른것을 확인 할 수 있습니다.
Shell에선 IoC에 관련된 패키지가 사용되었고 실제 View가 있는 Module에서 Wpf 패키지가 사용되었습니다.
이런점을 하나씩 보다보면 어떤 상황에 어떤 패키지를 설치하는게 유리할 지 알 수 있습니다.
'C# > Prism' 카테고리의 다른 글
[C# - Prism] 프리즘 예제 09 - ChangeConvention (0) | 2023.07.25 |
---|---|
[C# - Prism] 프리즘 예제 08 - ViewModelLocator (0) | 2023.07.25 |
[C# - Prism] 프리즘 예제 06 - ViewActivationDeactivation (0) | 2023.07.23 |
[C# - Prism] 프리즘 예제 05 - ViewInjection (0) | 2023.07.19 |
[C# - Prism] 프리즘 예제 04 - ViewDiscovery (0) | 2023.07.16 |
3년차 WPF 개발자입니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!