Prism.Wpf 7.1 でDIコンテナ(Unity)を直接操作する

Prism.Wpf 7.1 が正式リリースされました。DIコンテナの抽象化がされており、各モジュールをDI非依存で書けます。ただ、そうはいっても使いたい機能がない!ということはあるので、コンテナを直に触ることも可能になっています。この記事ではUnity(ゲームじゃないほう)を例に説明します。

なお、本記事のコードは下記リポジトリにあります。プロジェクトはPrism Template Packを使って作成しています。

https://github.com/GtTmy/UnityDIDemo


コンテナの触り方

今回はModuleAというモジュール内で触ってみます。下記のコードが全てです。


ModuleA/ModuleAModule.cs

using ModuleA.Views;

using Prism.Ioc;
using Prism.Modularity;
using Prism.Regions;
using Prism.Unity;
using Unity;
using Unity.Injection;

namespace ModuleA
{
public class ModuleAModule : IModule
{
public void OnInitialized(IContainerProvider containerProvider)
{
// 画面遷移を行う
// 今回の本題とは関係ないので説明略
var regionManager = containerProvider.Resolve<IRegionManager>();
regionManager.RequestNavigate("ContentRegion", nameof(ViewA));
}

// ここでコンテナへの登録作業を行う
public void RegisterTypes(IContainerRegistry containerRegistry)
{
// ContainerRegistryが抽象化されたコンテナへの登録用Interface

// GetContainerでUnityのコンテナに直接アクセスできる
// NugetにてUnity、Prism.Unityを導入する必要あり
var container = containerRegistry.GetContainer();

// 普通にUnityが利用可能
container.RegisterType<Models.ModelA>(new InjectionFactory(x =>
{
return new Models.ModelA("Hello, Prism 7.x !");
}));

// Viewの登録
containerRegistry.RegisterForNavigation<ViewA>();
}
}
}


注意点は下記2点です。


  1. Prism Template Packでモジュールを作成すると、最初はcontainerRegistry.GetContainer()が呼び出せません。Prism.UnityをNugetで追加してください。

  2. Prism.Unityの追加だけでは、Unityの一部機能しか使えません。欲しい機能がない場合、NugetでUnityを追加してください。


おわりに

上記のように、自由にUnityのコンテナを触れます。ただし、依存が増えるのでコンテナの乗り換えが大変になることに気を付けてください。

なお、Prism.Wpfの7系はまだ情報が少ないですが、Xamarin向けは先にリリースされていたのでそちらと、あとは公式のサンプルを参考にするとよいです。