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) { ... }
ここで問題が発生します。現時点では、Page
IContainer を使用して特定の「名前」の実装を解決する方法しかわかっていません。
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
ただし、これにより、デフォルトの空のコンストラクターが制限されます (または、巧妙な/望ましくないハッキングを行います)。
うーん、短編小説はかなり長くなります:)
よろしくお願いします