2014-11-03 50 views
0

我嘗試讓Unity使用帶參數的工廠方法來解析類型(對象),但我無法實現此功能。問題的來源在這個答案answer中描述。InjectionFactory爲命名實例

它說我需要註冊與每一個觀點:

m_Container.RegisterType<Object, View>("View"); 

否則RequestNavigate(「查看」)方法會失敗,但我不喜歡這種方式。 我不想用RequestNavigate(「Namespace.View」)導航,但這不起作用。

所以我試圖告訴團結集裝箱如何解決意見:

this.Container.RegisterType<object>(new InjectionFactory(this.ViewObjectFactory)); 

private object ViewObjectFactory(IUnityContainer iUnityContainer, Type type, string name) 
{ 
    //Never called 
} 

但如果容器被調用具有以下參數:

this.Container.Resolve(typeof(object), "Namespace.View"); 

一個對象被創建,工廠方法被忽略,我怎麼能得到統一調用一個類型的工廠方法(即使解析方法是用名稱調用)。

回答

1

當棱鏡解析視圖時,它使用指定的註冊。您對非指定註冊擁有注射工廠方法。我不相信有一種方法可以告訴團結在解決指定問題時解決非指定註冊問題。你可以將它們鏈接到一個普通的,但這不會幫助你,因爲你仍然需要將它們全部命名。如果你真的只想使用命名空間,你可以註冊全名作爲名稱。

我會做一個擴展方法來處理它,我

public static IUnityContainer RegisterView<TView>(this IUnityContainer container) 
{ 
    return container.RegisterType<object, TView>(typeof (TView).FullName); 
} 

你可以使用它作爲

m_Container.RegisterView<View>(); 

那麼對於棱鏡你需要更改請求導航總是傳遞視圖的全名。我要再次讓那些

public static void RequestNavigate<TView>(this IRegion region) 
{ 
    region.RequestNavigate(new Uri(typeof (TView).FullName, UriKind.Relative)); 
} 

public static void RequestNavigate<TView>(this IRegionManager region, string regionName) 
{ 
    region.RequestNavigate(regionName, new Uri(typeof (TView).FullName, UriKind.Relative)); 
} 

在代碼的擴展方法你可以使用它像

region.RequestNavigate<View>(); 

regionManager.RequestNavigate<View>("Main"); 

還有其他6個重載RequestNavigate,你將需要也可以創建擴展方法,如果您使用它們並希望以這種方式使用它。