1

私はこれに対する理想的なアプローチに苦労してきました。現在、アプリケーション シェルを作成する直前に、Boostrapper で次のメソッドでサービスを作成しています。

protected override DependencyObject CreateShell() 

シェルが作成されたら、すべてのビュー モデルを作成し、必要なサービスを渡します。

まず、それが良い習慣かどうかを知りたいです。また、.config ファイル内でサービスを宣言する例を見つけようとしましたが、実際には何も見つかりませんでした。これも良い習慣ではありませんか?

例:

    protected override DependencyObject CreateShell()
    {
        appWnd = ServiceLocator.Current.GetInstance<ApplicationWindow>();
        Container.RegisterInstance<ILicensing>(new LicensingService());
        Container.RegisterInstance<IAnotherService>(new AnotherService());

        return appWnd;
    }
4

1 に答える 1

1

UnityBootstrapper のメソッド ConfigureContainer() は、あなたが求めていることを行うためにオーバーライドされるはずです:

MSDN - コンテナの構成:

複合アプリケーション ライブラリとその上に構築されたアプリケーションの両方が、必要な依存関係を注入するためのコンテナーに依存します。UnityBootstrapper の次のコードに示すように、コンテナーの構成フェーズ中に、いくつかのコア サービスが登録されます。

UnityBootstrapper の MSDN

MSDN の例:

protected virtual void ConfigureContainer()
{
    …
    if (useDefaultConfiguration)
    {
        RegisterTypeIfMissing(typeof(IServiceLocator), typeof(UnityServiceLocatorAdapter), true);
        RegisterTypeIfMissing(typeof(IModuleInitializer), typeof(ModuleInitializer), true);
        RegisterTypeIfMissing(typeof(IModuleManager), typeof(ModuleManager), true);
        RegisterTypeIfMissing(typeof(RegionAdapterMappings), typeof(RegionAdapterMappings), true);
        RegisterTypeIfMissing(typeof(IRegionManager), typeof(RegionManager), true);
        RegisterTypeIfMissing(typeof(IEventAggregator), typeof(EventAggregator), true);
        RegisterTypeIfMissing(typeof(IRegionViewRegistry), typeof(RegionViewRegistry), true);
        RegisterTypeIfMissing(typeof(IRegionBehaviorFactory), typeof(RegionBehaviorFactory), true);
    }
}

Containerすでに行っているように、直接使用して、ここなどでインスタンスを登録することもできます。

CreateShell() メソッドはこれを行う場所ではありません。ここでシェルを作成する以外に何もする必要はありません。

つまり、ConfigureCatalog() をオーバーライドしてコードを貼り付けるだけです。

于 2013-03-05T19:23:26.710 に答える