2017-02-14 19 views
0

Я начинаю в зависимости от инъекции. Я использовал Microsoft Unity в консольном приложении, чтобы начать и поднять основы. Все, что я хотел вызвать метод класса добавления или класс Substraction, основанный на регистрации класса I, для ссылки на интерфейс. Но я получаю referrce InterfaceReference как null. Пожалуйста, предложите, где я делаю неправильно в следующем случае?Как вводить зависимость, используя единство (основы)?

Я использовал один interfacer -

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. Посмотрите на Using Unity DI with a Console Application

Что-то вроде следующего кода (я не использовал единство какое-то время, поэтому я не уверен, что синтаксис полностью правильный). В основном вам также необходимо зарегистрировать класс программы с Unity, а затем использовать метод Unity Resolve для создания экземпляра программы. Поскольку 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

thanx это сработало для меня. Однако, насколько это необходимо - myContainer.RegisterType (); потому что код работает и без этого. – user2318170

+0

Оставь это! Прошло некоторое время с тех пор, как я использовал Unity, и я не был уверен, нужно ли явно регистрировать программу с Unity перед использованием Resolve. Часто точка входа реализует интерфейс, и вы регистрируете реализацию интерфейса, а затем вызываете решение на интерфейсе –

0

Проблема в том, что вы не вызываете метод разрешения единства после регистрации типа. Это, например, будет работать:

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