【问题标题】:InjectionFactory for Named instance命名实例的 InjectionFactory
【发布时间】:2014-11-03 15:36:51
【问题描述】:

我尝试让 Unity 使用带参数的工厂方法解析类型(对象),但我无法使其正常工作。此答案answer 中描述了问题的根源。

它说我需要注册每个视图:

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
}

但是如果使用以下参数调用容器:

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

创建了一个对象并且忽略了工厂方法,我怎样才能统一调用一个类型的工厂方法(即使使用名称调用解析方法)。

【问题讨论】:

    标签: c# wpf unity-container prism


    【解决方案1】:

    当 prism 解析视图时,它使用的是命名注册。您在非命名注册上有注入工厂方法。我不相信在解决命名注册时有办法告诉统一解决非命名注册。您可以将它们链接到一个通用的,但这对您没有帮助,因为您仍然需要将它们全部命名。如果您真的只想使用命名空间,您可以将全名注册为名称。

    我会做一个扩展方法来为我处理它

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

    你会把它当作

    m_Container.RegisterView<View>();
    

    那么对于 prism,您需要将导航请求更改为始终传入视图的全名。我会再次为那些做一个扩展方法

    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 个其他重载,如果您使用它们并希望以这种方式使用它,您还需要为其创建扩展方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-23
      • 1970-01-01
      • 1970-01-01
      • 2018-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多