DryIoc - 在使用键名注册基类时解析某个类

时间:2016-03-28 22:04:24

标签: c# dryioc

尝试在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拥有默认的空构造函数(或执行一些聪明/不需要的黑客攻击)

嗯做短篇小说的时间很长:)

祝你好运

1 个答案:

答案 0 :(得分:3)

而不是注册使用RegisterMany

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

这将注册TPage提供的多种服务类型的单一工厂:TPage本身,基本页面类和接口(如果有的话)。

// works
Container.Resolve<Page>(
     serviceKey: whatever);