2016-03-28 74 views
1

試圖在Prism.Forms中構建對DryIoc的支持(https://github.com/joacar/Prism/tree/pr-517),並偶然發現了一個場景,我無法設法解決該如何操作。DryIoc - 使用密鑰名稱註冊基類時解決dervied類

爲了長話短說,這些問題歸結爲:在Prism.DryIoc.Forms中創建新應用程序時,將創建PrismApplicationBase的應用程序子類並覆蓋某些方法,其中之一是RegisterTypes。

調用時,用戶可以在導航類DryIocPageNavigationService介入導航

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); 
} 

註冊一個視圖,並有一個方法重寫protected Page CreatePage(string name) { ... }

這裏談到的問題:在這個時候,我們才知道解決給定的「名字」使用的IContainer的Page的實現。

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有默認的空構造函數(或做一些聰明的/不希望的黑客)

嗯做簡短的故事變得很長:)

問候

回答

3

而是註冊RegisterMany的使用:

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

這將通過提供TPAGE多個服務類型寄存器單個工廠:TPAGE本身,Page基類,和接口(如有)。

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

就像一個魅力,謝謝! – joacar

+0

我正要打開一個問題關於這一點,謝謝! – MusuNaji