2014-11-03 56 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,你将需要也可以创建扩展方法,如果您使用它们并希望以这种方式使用它。