web-dev-qa-db-ja.com

Prism.Formsの方が優れているIoCコンテナー

私は新しいPrism.Formsプロジェクトで、さまざまなIoCコンテナAutofacDrylocNinjectまたはUnity)を使用することをお勧めします。

これが本当かどうかはわかりませんが、Unityが現在アクティブな開発中ではなく、これとMEFが唯一のIoCcontainers今まで使用したことがあるかどうかはわかりません。

その間、私はAutofacDryloc、またはNinjectについてほとんどまたはまったく知りません。

アドバイスでは客観的になってください。単に「私はxxx;私は情報に基づいた決定をしたいと思います。

21
Martin Robins

私ができる最善のことは、現在の事実をレイアウトすることです。

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抽象化で直接サポートされていない、より複雑なアクションを実行できます。

更新2

Prism 7.2では、IoC抽象化に関するAPIの変更がいくつか導入されました。特に、概してこれらの変更はほとんどのユーザーには影響しません。ただし、7.2に対してビルドされていないPrism.Plugin.Popupsなど、Prismを参照する他のライブラリを使用すると、バイナリの非互換性が発生する場合があります。

IoCの変更点は次のとおりです。

  • Fluent API
  • サービスが登録されているかどうかを確認する機能
  • 一時サービスとシングルトンサービスの両方を名前付きサービスにできるメソッドを追加しました
  • 指定されたインスタンスでサービスを解決する機能が追加されました。
50
Dan S.