2017-02-14 1 views
0

저는 의존성 삽입에 초보자입니다. 콘솔 응용 프로그램에서 Microsoft Unity를 사용하여 기초를 닦고 시작했습니다. 내가 인터페이스 참조에 등록한 클래스에 기반한 Addition Class 또는 Substraction Class의 메소드를 호출하기를 원했다. 하지만 refernce InterfaceReference가 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 구현을 주입 생성자

나는 하나 interfacer을 사용했다. Unity Resolve를 사용하여 Program 클래스의 인스턴스를 만들어야합니다. 좀 봐봐 Using Unity DI with a Console Application

다음 코드와 같은 것 (나는 단호함을 사용하지 않는다. 그래서 구문이 완전히 올바른지 확실하지 않다.). 기본적으로 Unity에 Program 클래스를 등록한 다음 Unity Resolve 메서드를 사용하여 Program의 인스턴스를 만들어야합니다. Unity는 프로그램에 대해 알고 있기 때문에이 해결 방법은 프로그램에 대한 종속성 트리를 만듭니다.

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

고맙습니다. 그러나, 이것이 얼마나 필요한가 - myContainer.RegisterType (); 왜냐하면 코드는 이것도없이 작동하기 때문입니다. – user2318170

+0

그럼 나가주세요! Unity를 사용한지 얼마되지 않아 Resolve를 사용하기 전에 Unity와 Program을 명시 적으로 등록해야하는지 확실하지 않았습니다. 종종 진입 점이 인터페이스를 구현하고 인터페이스의 구현을 등록한 다음 인터페이스에서 resolve를 호출합니다 –

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(); 
    } 
} 
관련 문제