2

PrismのIModuleInitialize()メソッドでは、RegisterViewWithRegion()メソッドが呼び出されて、ビューと領域がマップされます。

これらの2行のコードの違いは何ですか?なぜServiceLocatorを使用するのですか?

_regionManager.RegisterViewWithRegion("Region1", () => _serviceLocator.GetInstance<View1>());

_regionManager.RegisterViewWithRegion("Region1", typeof(View1));

コンテキストのModuleInit.csクラス全体を次に示します。

namespace MyModule
{
[ModuleExport("MyModule.ModuleInit", typeof(MyModule.ModuleInit))]
public class ModuleInit : IModule
{
    private readonly IRegionManager _regionManager;
    public IServiceLocator _serviceLocator;


    [ImportingConstructor]
    public ModuleInit(IRegionManager regionManager, IServiceLocator serviceLocator)
    {
        _regionManager = regionManager;
        _serviceLocator = serviceLocator;
    }

    #region IModule Members

    public void Initialize()
    {
        _regionManager.RegisterViewWithRegion("Region1", () => _serviceLocator.GetInstance<View1>());
    }

    #endregion
}
}

[編集]

RegisterViewWithRegionメソッドのMSDNサイトでは、2つの異なるバージョンの機能について説明しています。

RegisterViewWithRegion(IRegionManager, String, Func<Object>) 

ビューのconcreateインスタンスを解決するためにデリゲートを使用して、ビューをリージョンに関連付けます。リージョンが表示されると、このデレルゲートが呼び出され、結果がリージョンのビューコレクションに追加されます。

RegisterViewWithRegion(IRegionManager, String, Type)

タイプを登録して、ビューをリージョンに関連付けます。リージョンが表示されると、このタイプはServiceLocatorを使用して具体的なインスタンスに解決されます。インスタンスがリージョンのViewsコレクションに追加されます

したがって、唯一の違いは、ServiceLocatorを使用して、タイプをインスタンスにすぐに解決するか、後でリージョンが表示されたときに解決することだと思いますか?

[編集2]

Stackoverflowの他の場所で答えを見つけました

4

1 に答える 1

1

これは、メインのアプリがモジュールについて認識していないためです。

モジュールがロードされると、 に登録され、 にServiceLocatorアクセスできますRegionManager
次に、メイン アプリが新しく読み込まれたモジュールについて何も知らなくても、モジュールからメイン アプリにビューを挿入できます (たとえば、新しいタブ)。

ServiceLocatorMEF に依存関係を要求するため、いつでもパラメーターなしで呼び出すことができ、MEF は、のコンストラクター シグネチャ_serviceLocator.GetInstance<View1>()で何を変更しても、インポートする必要があるものを解決します。View1

于 2012-11-28T11:06:00.830 に答える