2017-02-14 60 views
0

我是依赖注入的初学者。我在控制台应用程序中使用Microsoft Unity来开始并刷新基础知识。所有我想要基于类I注册的接口引用调用Addition Class或者Substraction Class的方法。但是我将参考接口引用设为null。请在下面的情况下建议我做错了什么?如何使用统一(基础)注入依赖关系?

我用一个接口部分 -

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

和2 claess -

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(); 
     } 
    } 
} 

回答

1

你不是实例程序类,让注射的IArithmetic实现永远不会运行构造。您需要使用Unity Resolve来创建Program类的实例。看看Using Unity DI with a Console Application

像下面的代码(我没有使用过一段时间,所以我不知道如果语法是完全正确的)。基本上,您还需要使用Unity注册Program类,然后使用Unity Resolve方法创建Program的一个实例。由于Unity知道Program,此解决方案将为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(); 
     } 
    } 
} 
+0

thanx它为我工作。然而,这是多少必要的 - myContainer.RegisterType ();因为代码没有这个工作也。 – user2318170

+0

然后离开它!自从我使用Unity之后,我不确定是否必须在使用Resolve之前明确注册Program with Unity。入口点通常会实现一个接口,您将注册接口的实现,然后在接口上调用解析 –

0

问题是您在注册类型后没有调用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(); 
    } 
}