1

Prism.Forms ( https://github.com/joacar/Prism/tree/pr-517 ) で DryIoc のサポートを構築しようとすると、どうすればよいか分からないシナリオに出くわしました。

簡単に言うと、問題は次のようになります。Prism.DryIoc.Forms で新しいアプリケーションを作成するとき、PrismApplicationBase のアプリケーション サブクラスを作成し、特定のメソッドをオーバーライドします。そのうちの 1 つは RegisterTypes です。

呼び出されると、ユーザーはナビゲーション用のビューを登録できます

container.RegisterPageForNavigation<MockView>(); 
// Extension method implementation
public static void RegisterPageForNavigation<TPage>(this IContainer container) 
where TPage : Xamarin.Forms.Page
{
    container.Register<TPage>(typeof(TPage).FullName);
}

ナビゲーション中にクラスDryIocPageNavigationServiceが関与し、オーバーライドするメソッドが 1 つあります。protected Page CreatePage(string name) { ... }

ここで問題が発生します。現時点では、PageIContainer を使用して特定の「名前」の実装を解決する方法しかわかっていません。

protected Page CreatePage(string name) 
{ 
    // Always returns null
    return _container.Resolve<Page>(name, IfUnresolved.DefaultOrNull);
}

ただし、そのような方法で拡張メソッドを実装すると、

 public static void RegisterPageForNavigation<TPage>(this IContainer container)
 where TPage : Xamarin.Forms.Page, new()
 {
     container.Register<Page>(made: 
         Made.Of(() => new TPage()),serviceKey:typeof(TPage).FullName);
 }

ページが解決されます。TPageただし、これにより、デフォルトの空のコンストラクターが制限されます (または、巧妙な/望ましくないハッキングを行います)。

うーん、短編小説はかなり長くなります:)

よろしくお願いします

4

1 に答える 1

3

Register の代わりに RegisterMany を使用します

Container.RegisterMany<TPage>(
     serviceKey: whatever);

これにより、TPage によって提供される複数のサービス タイプ (TPage 自体、基本 Page クラス、および存在する場合はインターフェイス) を持つ単一のファクトリが登録されます。

// works
Container.Resolve<Page>(
     serviceKey: whatever);
于 2016-03-29T05:03:34.860 に答える