我尝试让Unity使用带参数的工厂方法来解析类型(对象),但我无法使其工作。问题的来源在这个答案answer中描述。
它说我需要注册每个视图:
m_Container.RegisterType<Object, View>("View");
否则RequestNavigate(&#34; View&#34;)方法会失败,但我不喜欢这种方法。 我不想使用RequestNavigate(&#34; Namespace.View&#34;)进行导航,但这不起作用。
所以我试着告诉Unity Container如何解决这些问题:
this.Container.RegisterType<object>(new InjectionFactory(this.ViewObjectFactory));
private object ViewObjectFactory(IUnityContainer iUnityContainer, Type type, string name)
{
//Never called
}
但是如果使用以下参数调用Container:
this.Container.Resolve(typeof(object), "Namespace.View");
创建一个对象并忽略工厂方法,如何为一个类型调用一个工厂方法(即使使用名称调用resolve方法)。
答案 0 :(得分: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重载,如果您使用它们并想要以这种方式使用它,您还需要创建扩展方法。