【问题标题】:Unity InjectionProperty does not workUnity InjectionProperty 不起作用
【发布时间】:2018-02-14 13:43:08
【问题描述】:

我的计算器配置依赖于其视图 (GUI) 的定义如下(然后在当前上下文中解析):

    Dependencies.register<IView, View>(
        "standardView"
    );

    //Register: calculator release configuration
    Dependencies.register<ICalculator, Calculator>(
        "releaseCalculator",
        (new InjectionProperty(
            "IView", 
            Dependencies.resolve<IView>("standardView")
        ))
    );

    //Resolve:
    Calculator theCalculator = (Calculator)Dependencies.resolve<ICalculator>(
        "releaseCalculator"
    ); 

Dependencies 是 IUnityContainer 的包装器。

Calculator 中的注入点是:

private IView view;
[Dependency]
public IView IView{
    get{return view;}
    set{view = value;}
} 

如果您希望查看 Dependencies 的定义,请注意它绝对等同于统一容器的投影,除非我已经扩展了对生命周期管理器的直接控制。

问题很简单;鉴于上述设置,Property IView 在运行时解析为 null。就好像 Unity 根本无法正常工作。

@Haukinger 这是包装器:

using System.Collections.Generic;
using Unity;
using Unity.Lifetime;
using Unity.Registration;


namespace Calculator.Utils
{
public static class Dependencies
{
    private static IUnityContainer graph;
    private static List<KeyValuePair<string, LifetimeManager>> lifetimeManagers;


    static Dependencies(){
        //container
        graph = new UnityContainer();
        //instance managers 1 per dependency instance (implementor)
        lifetimeManagers = new List<KeyValuePair<string, LifetimeManager>>();
    }


  //STATES:
    public static void register<I, P>(string alias, params InjectionMember[] injections)
    {
        ContainerControlledTransientManager newLM = new ContainerControlledTransientManager();
        lifetimeManagers.Add(new KeyValuePair<string, LifetimeManager>(
            alias,
            newLM
        ));
        graph.RegisterType(
            typeof(I),
            typeof(P),
            alias,
            newLM,
            injections
        );
    }

    //function is identitical to Resolve
    public static T resolve<T>(string alias)
    {
        return (T)graph.Resolve(typeof(T), alias);
    }

    public static void dispose(string alias)
    {
        LifetimeManager target = (ContainerControlledTransientManager)lifetimeManagers.Find((elem)=>(elem.Key.Equals(alias))).Value;
        target.Dispose();
    }
}

}

【问题讨论】:

    标签: c# .net dependency-injection properties unity-container


    【解决方案1】:

    命名注册仅在您请求所有注册类型时注入,即IView[] allViews。如果您只请求一个实例,您将收到默认注册,在您的情况下只是null,因为您没有默认注册。

    删除名称 (standardView) 并将 null 作为参数 name 传递给 RegisterType,您就可以开始了。

    编辑:这段代码在我的机器上运行良好

    internal class Program
    {
        static void Main( string[] args )
        {
            var container = new UnityContainer();
            container.RegisterType<IDependency, MyDependency>((string)null);
            var resolved = container.Resolve<Consumer>();
            // resolved.Dependency is an instance of MyDependency
        }
    }
    
    internal class Consumer
    {
        [Dependency]
        public IDependency Dependency { get; set; }
    }
    
    public interface IDependency
    {
    }
    
    internal class MyDependency : IDependency
    {
    }
    

    【讨论】:

    • 我在 Register 和 Resolve 阶段都将 alias 参数更改为 null。它仍然解析为 null。有什么想法吗?
    • 我用 unity 5.6 构建了一个最小的例子,它工作正常。我怀疑你的包装器有问题。
    • 请问我可以看看吗?
    • 另外,我有 Unity 5.5.6,但考虑到我正在尝试做的事情是如此基本,我怀疑这是一个问题。
    • 您也可以将包装器添加到问题中吗?
    猜你喜欢
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多