ユニティ拡張を備えたプリズムの子コンテナでの作業

dependency-injection ioc-container prism silverlight unity-container
ユニティ拡張を備えたプリズムの子コンテナでの作業

コンテキスト

特定のユースケースに関連するナビゲーションやその他のものを管理するユースケースコントローラーを使用できるように、SilverlightアプリケーションでPRISMと単一性を使用してシステムを構築する方法を探しています。 このユースケースコントローラーには、そのユースケースに必要な依存関係を分離できるように、独自の単一コンテナーが必要です。

コード

次のスニペットを使用して、ユースケースコントローラーを初期化し、正しい子コンテナーを使用するようにセットアップします。

public class MyController
{
    private IUnityContainer _container;

    public MyController(IUnityContainer container)
    {
        _container = container;

        _container.RegisterType(ModuleViews.MyChildView);
    }

    [Dependency]
    public IRegionManager RegionManager { get; set; }

    public StartUseCase()
    {
        // This results in a resolve action for System.Object instead of the view I registered
        // in the child container
        this.RegionManager.RequestNavigate(ModuleRegions.ChildRegion,ModuleViews.MyChildView);
    }

    public static MyController Create(IUnityContainer container)
    {
        var childContainer = container.CreateChildContainer();
        childContainer.RegisterInstance(childContainer);

        // The container view is registered in the parent container
        var containerView = container.Resolve(GlobalViews.MyContainerView);
        var childRegionManager = parentRegionManager.Regions[GlobalRegions.MainRegion].Add(containerView,GlobalViews.MyContainerView,true);

        childContainer.RegisterInstance(childRegionManager);

        var controller = childContainer.Resolve();

        return controller;
    }
}

問題

基本は機能しますが、 `RegionManager.TryNavigate(…​)`を使用しようとすると、指定した名前のビューは解決されません。 子コンテナーに正しい名前でビューを登録しましたが、ユースケースコントローラーで取得したRegionManagerは、どういうわけかルートコンテナーに登録したビューのみを解決します。

私の質問

親の単一コンテナーに登録せずに、子ビューを正しく解決できるようにするために何をする必要がありますか。

  0  0


ベストアンサー

これは、リージョンがデフォルトのServiceLocatorを使用してビューを解決しようとしているためです。 リージョンがビューを解決しようとすると、RegionNaviationServiceに移動し、これを使用してビューを解決しようとします。 デフォルトのRegionNavigationServiceは、ServiceControllerを使用してこれを行います。

これを回避したい場合は、リージョンのNavigationServiceプロパティに1を渡すことで、リージョンに新しいRegionNavigationServiceを与えることができます。 これを使用して、デフォルトで使用するデフォルトのServiceLocatorではなく、使用するUnityコンテナーからのビューをリージョンが解決するようにすることができます。

お役に立てれば

1


タイトルとURLをコピーしました