尝试在Prism.Forms(https://github.com/joacar/Prism/tree/pr-517)中建立对DryIoc的支持,偶然发现了一个我无法解决该问题的方法。
简而言之,问题归结为:在Prism.DryIoc.Forms中创建新应用程序时,可以创建PrismApplicationBase的应用程序子类并覆盖某些方法,其中一种是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
会涉及,并且有一种方法可以覆盖protected Page CreatePage(string name) { ... }
问题出现了:目前我们只知道使用IContainer解决Page
给定'name'的实现。
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
拥有默认的空构造函数(或执行一些聪明/不需要的黑客攻击)
嗯做短篇小说的时间很长:)
祝你好运
答案 0 :(得分:3)
而不是注册使用RegisterMany:
Container.RegisterMany<TPage>(
serviceKey: whatever);
这将注册TPage提供的多种服务类型的单一工厂:TPage本身,基本页面类和接口(如果有的话)。
// works
Container.Resolve<Page>(
serviceKey: whatever);