私は新しいPrism.Forms
プロジェクトで、さまざまなIoC
コンテナ(Autofac
、Dryloc
、Ninject
またはUnity
)を使用することをお勧めします。
これが本当かどうかはわかりませんが、Unityが現在アクティブな開発中ではなく、これとMEF
が唯一のIoC
containers今まで使用したことがあるかどうかはわかりません。
その間、私はAutofac
、Dryloc
、またはNinject
についてほとんどまたはまったく知りません。
アドバイスでは客観的になってください。単に「私はxxx;私は情報に基づいた決定をしたいと思います。
私ができる最善のことは、現在の事実をレイアウトすることです。
DryIocは、私が使用し、最も推奨するコンテナです。それは活発に開発中であり、非常に高速で、Prismの現在のリリースでうまく機能します。また、重要なことは、質問や問題がある場合、メンテナーは問題に迅速に対処したり、質問に答えたりしたことです。これらすべての理由から、私はコンテナを推奨し続けています。 Unityとは異なり、APIは非常に安定している傾向があり、Prismの特定のリリースが対象としていたものを超えてDryIocを更新することにまだ問題がありませんでした。
nityは、Brianが長年使用してきたコンテナであり、テンプレートで利用可能な最初の(そして長い間のみ)コンテナであるため、最も人気のあるコンテナです。メンテナンスされずにかなり時間が経っていましたが、プロジェクトには新しいメンテナーがいます。 Unity 5には、Prism 6.3を使用してUnity 5にアップグレードすることが不可能な多数の重大な変更があったことに注意してください。ただし、Prismは、Prism 7のすべてのプラットフォームでUnity 5に更新されました。Unityは、ベンチマークパフォーマンスに関してもほぼ平均です。 Prism 6.XからPrism 7へのアップグレードでは、UnityまたはCommon Service Locatorへの参照をすべてアンインストールしてから、Unity NuGetパッケージではなくUnity.Container NuGetパッケージを対象とするPrism.Unity.Formsを更新する必要があることに注意してください。また、Unityはマイナーパッチからマイナーパッチへの説明やドキュメントなしで多数の重大な変更を導入しているため、Prismのビルド対象よりも新しいバージョンのUnityをターゲットにするとアプリケーションが破損する可能性があることに注意する必要があります。
Autofacは、人気があるにもかかわらず、一般的には使用しないことをお勧めするコンテナです。人々はAPIに非常に混乱しているようです。 Prism 6.3では、実装が非常に悪いために苦しみます。 Prism 7では、いくつかの重大な変更が導入され、PrismApplicationで使用されるContainerBuilderを提供することで、登録に関する多くの問題が解決されました。 Autofacコミュニティーはコンテナーを不変にすることに固執しているため、常に使用しないことをお勧めします。基本的なアプリでは機能しますが、モジュール性などのより高度なPrism機能を使用できなくなります。注:Prism 7.1のリリース後、PrismチームはAutofac Containerのサポートをすべて終了することを決定しました。コンテナがPrismが提供するすべての機能をサポートできない場合、それは公式にサポートされるコンテナであってはならないとPrismチームは信じています。
Ninject(非推奨)は問題ありません。これは確かに最も使用率の低いコンテナであり、さまざまなコンテナのベンチマークからも最も低速です。 Prism 6.3は、死んだプロジェクトのように見えるPortable.Ninjectを利用しました。 Prism 7.0は、当初NetStandard2.0をターゲットとしていた公式のNinjectプロジェクトを利用しようとしました。コンテナのサポートは、NinjectコンテナとXamarin AndroidとXamarin iOSの間の根本的な非互換性により、後に完全に撤回されました。
DryIocは、私が使用し、最も推奨するコンテナです。それは活発に開発中であり、非常に高速で、Prismの現在のリリースでうまく機能します。また、重要なことは、質問や問題がある場合、メンテナーは問題に迅速に対処したり、質問に答えたりしたことです。これらすべての理由から、私はコンテナを推奨し続けています。 Unityとは異なり、APIは非常に安定している傾向があり、Prismの特定のリリースが対象としていたものを超えてDryIocを更新することにまだ問題がありませんでした。
注目に値するのは、Prism 7のプレビュー5からコンテナを抽象化したことです。これにより、APIはサービスとビューの登録方法に関してまったく同じであるため、最終的に選択したコンテナー間での切り替えがはるかに簡単になります。さらに複雑な登録を行うことができるように、拡張メソッドを介してContainerおよびAutofacの場合はContainerBuilderに引き続きアクセスできます。
// Prism 6.X way of Registering Services
protected override void RegisterTypes()
{
// Container Specific Registrations
// Autofac
Builder.RegisterType<DebugLogger>().As<ILoggerFacade>().SingleInstance();
// DryIoc
Container.Register<ILoggerFacade, DebugLogger>(reuse: Reuse.Singleton,
ifAlreadyRegistered: IfAlreadyRegistered.Replace);
// Ninject
Container.Bind<ILoggerFacade>().To<DebugLogger>().InSingletonScope();
// Unity
Container.RegisterType<ILoggerFacade, MCAnalyticsLogger>(new ContainerControlledLifetimeManager());
}
// Unified API in Prism 7
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterSingleton<ILoggerFacade, DebugLogger>();
}
また、PrismのIoC抽象化により、より統一されたAPIが簡単になりましたが、基になるコンテナと直接対話する機能が削除されないことを覚えておくことが重要です。基になるコンテナにアクセスするには、GetContainer拡張メソッドを呼び出すだけで、PrismのIoC抽象化で直接サポートされていない、より複雑なアクションを実行できます。
Prism 7.2では、IoC抽象化に関するAPIの変更がいくつか導入されました。特に、概してこれらの変更はほとんどのユーザーには影響しません。ただし、7.2に対してビルドされていないPrism.Plugin.Popupsなど、Prismを参照する他のライブラリを使用すると、バイナリの非互換性が発生する場合があります。
IoCの変更点は次のとおりです。