Prism コードサンプル学習:04-ViewDiscovery
はじめに
以下の記事の続きです。
https://qiita.com/mngreen/items/f03d9a15eee1ed77f387
04-ViewDiscovery
本サンプルではRegionManagerクラスを用いて、コントロールを探し出して適応させるサンプルのようです。
<Window x:Class="ViewDiscovery.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://prismlibrary.com/"
Title="Shell" Height="350" Width="525">
<Grid>
<ContentControl prism:RegionManager.RegionName="ContentRegion" />
</Grid>
</Window>
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow(IRegionManager regionManager)
{
InitializeComponent();
//view discovery
// (補足:ViewAはUserControl型で定義されたコントロール)
regionManager.RegisterViewWithRegion("ContentRegion", typeof(ViewA));
}
}
- 03-CustomRegionsでは既存のStackPanelに対してUI要素を追従させられるようにしていたのに対し、今回のサンプルではUserControlの型によって適応させている
- regionManager.RegisterViewWithRegionメソッドはこちら
- メソッド内部ではDIでIRegionViewRegistryのインスタンスを取得して利用している。
- IRegionViewRegistryを継承しているのはRegionViewRegistry
- 型情報からDIでViewのインスタンスを返している。(https://github.com/PrismLibrary/Prism/blob/8ae9e655657d64637150d1bf7491fe24d7b41298/src/Wpf/Prism.Wpf/Regions/RegionViewRegistry.cs#L86)
- ただ、先程の呼び出しタイミングは分かっていない。また、同じアセンブリ内であれば、ViewとViewModelの型情報を集めてくれるという記事があったが、その回答にはなっていない。
- ここが型情報をかき集めている?https://github.com/PrismLibrary/Prism/tree/master/src/Wpf/Prism.Wpf/Modularity
- アセンブリを必要に応じて読み込んでいる
- 遅延ローディングする仕組み
- 上記の仕組みを利用している FileModuleTypeLoader.LoadModuleType()
- 読み込めていない場合は上記の遅延ローディングの仕組みで読み込み
- IsSuccessfullyDownloaded()メソッドを読むとlock文が利用されていることからマルチスレッド動作を想定していることがわかる
- さらに呼び出し元をたどるとModuleManager.LoadModule()メソッドから呼び出される
- ModuleManagerFixtureクラスでLoadModule()メソッドのUTがあるので、読み深めるのもありかもしれない
深く読みすすめるにはまだ理解が浅いので、本記事ではここまでにしておき、他のサンプルも読み進めた後に戻って来ようと思います。
おわりに
今回はRegionManagerクラスのソースコードを中心に読みました。
UTなどを実行させてみたりしたものの、仕組み全体をもう少し知らないとわからないようです。
それを明らかにできるように引き続き読んでいきます。
次回、05-ViewInjectionについて見ていこうと思います。