命名实例的InjectionFactory
本文关键字:InjectionFactory 实例 | 更新日期: 2023-09-27 18:28:51
我试图让Unity使用带参数的工厂方法来解析类型(对象),但我无法实现。问题的来源在这个答案中描述。
它说我需要注册每个视图:
m_Container.RegisterType<Object, View>("View");
否则RequestNavigate("View")方法将失败,但我不喜欢这种方法。我不想使用RequestNavigate("Namespace.View")进行导航,但这不起作用。
所以我试着告诉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");
一个对象被创建,而工厂方法被忽略,我怎么能让unity为一个类型调用工厂方法(即使resolve方法是用名称调用的)。
当棱镜解析视图时,它使用命名注册。您在非命名注册上有注入工厂方法。我不认为有任何方法可以告诉团结在解决命名注册时解决非命名注册。你可以把它们串成一个普通的,但这对你没有帮助,因为你仍然需要把它们全部命名。如果你真的只想使用名称空间,你可以将全名注册为名称。
我会做一个扩展方法来为我处理
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");
RequestNavigate还有6个其他重载,如果您使用了它们并希望以这种方式使用它们,那么您也需要为它们创建扩展方法。