名称实例的InjectionFactory

时间:2014-11-03 15:36:52

标签: c# wpf unity-container prism

我尝试让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方法)。

1 个答案:

答案 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重载,如果您使用它们并想要以这种方式使用它,您还需要创建扩展方法。