如何使用 unity(基础)注入依赖?

How to inject dependency using unity (basics) ?

我是初学者 injection.I 在控制台应用程序中使用 Microsoft Unity 来开始和复习基础知识。我想根据注册到接口引用的 class 调用加法 Class 或减法 Class 的方法。但是我将 InterfaceReference 引用为 null。请建议我在以下情况下做错了什么?

我使用了一个接口 -

namespace ConsoleApplication3
{
    interface IArithmetic
    {
        int DoOperation(int a, int b);
    }
}

还有 2 个班级 -

namespace ConsoleApplication3
{
    class Addition : IArithmetic
    {
        public int DoOperation(int a, int b)
        {
            return a + b;
        }
    }
}

namespace ConsoleApplication3
{
    class Substraction : IArithmetic
    {
        public int DoOperation(int a, int b)
        {
            return a - b;
        }
    }
}



namespace ConsoleApplication3
{
    class Program
    {
        private static IArithmetic InterfaceReference;

        public Program(IArithmetic InterfaceReferenceParam)
        {
            InterfaceReference = InterfaceReferenceParam;
        }

        static void Main(string[] args)
        {

            IUnityContainer myContainer = new UnityContainer();
            myContainer.RegisterType<IArithmetic, Addition>();
            int output = InterfaceReference.DoOperation(5, 2);
            Console.Write(output);
            Console.WriteLine();
        }
    }
}

您没有实例化您的程序 class,因此注入 IArithmetic 实现的构造函数永远不会 运行。您需要使用 Unity Resolve 创建程序的实例 class。看看

类似于下面的代码(我有一段时间没有使用unity,所以我不确定语法是否完全正确)。基本上你还需要在Unity中注册Program class,然后使用Unity Resolve方法创建Program的实例。因为 Unity 知道 Program,所以这个 resolve 将为 Program 创建依赖树。

namespace ConsoleApplication3
{
    class Program
    {
        private IArithmetic InterfaceReference;

        public Program(IArithmetic InterfaceReferenceParam)
        {
            InterfaceReference = InterfaceReferenceParam;
        }

        public void Run()
        {
            int output = InterfaceReference.DoOperation(5, 2);
            Console.Write(output);
            Console.WriteLine();

        }

        static void Main(string[] args)
        {
            IUnityContainer myContainer = new UnityContainer();
            myContainer.RegisterType<IArithmetic, Addition>();
            myContainer.RegisterType<Program, Program>();
            var program = myContainer.Resolve<Program>();
            program.Run();
        }
    }
}

问题是您在注册类型后没有调用 Unity Resolve 方法。例如,这将起作用:

class Program
{
    static void Main(string[] args)
    {
        IUnityContainer container = new UnityContainer();
        container.RegisterType(typeof(IArithmetic), typeof(Addition));
        var arithmeticHelper = container.Resolve<IArithmetic>();
        int output = arithmeticHelper.DoOperation(5, 2);
        Console.Write(output);
        Console.ReadKey();
    }
}