2015-05-22 4 views
1

Я изучаю инъекцию зависимостей с небольшим примером. Я получаю сообщение об ошибке «ссылка на объект не указывает на экземпляр объекта» из метода ProcessOrder() ниже на этой линии:Сообщение об ошибке впрыска

_iordProc.ProcessOrder(popOrder); 

Что я делаю неправильно? Мне нужно предоставить конструктор без параметров?

Вот мой код ...

public interface IOrderProcessingEngine 
{ 
    void ProcessOrder(Order objOrder); 
    void EmailOrder(Order objEmailOrd); 
} 

public class Order 
{ 
    public String OrderId { get; set; } 
    public decimal Amount { get; set; } 
    public String OrderDate { get; set; } 
    public String DeliveryDate { get; set; } 
    public String FirstName { get; set; } 
    public String LastName { get; set; } 
} 

public class OrderProcessingEngine : IOrderProcessingEngine 
{ 
    public void ProcessOrder(Order objOrder) 
    { 
     Console.WriteLine("This method will process my order which is very cool"); 
    } 

    public void EmailOrder(Order objEmailOrd) 
    { 
     Console.WriteLine("This method will send email to the customers"); 
    } 
} 

public class OrderService 
{ 
    //Dependency Injection 
    private readonly IOrderProcessingEngine _iordProc; 

    public OrderService(IOrderProcessingEngine objOrdproc) 
    { 
     _iordProc = objOrdproc; 
    } 

    public OrderService() 
    { 

    } 

    public void ProcessOrder(Order popOrder) 
    { 
     //Getting an error here on next line -- object reference not set to an instance of an object 
     _iordProc.ProcessOrder(popOrder); 
     _iordProc.EmailOrder(popOrder); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Order myOrder = new Order(); 
     myOrder.OrderId = "1001"; 
     myOrder.Amount = 2000; 
     myOrder.OrderDate = "05/22/2015"; 
     myOrder.DeliveryDate = "05/30/2015"; 
     myOrder.FirstName = "Johnson"; 
     myOrder.LastName = "Adoga"; 

     OrderService objOrdServ = new OrderService(); 
     objOrdServ.ProcessOrder(myOrder); 

     Console.ReadLine(); 
    } 
} 
+2

Если вы планируете делать это на производстве, вы можете рассмотреть возможность использования инфраструктуры DI, например [Autofac] (http://autofac.org) или [Ninject] (http://www.ninject.org). – neontapir

ответ

3

Ну, да, это, безусловно, не получится, так как вы используете конструктор без параметров:

OrderService objOrdServ = new OrderService(); 

Так _iordProc всегда будет нулевым при использовании в этой манере. Либо передайте этот параметр, либо используйте инфраструктуру IoC, которая будет создавать для вас экземпляр.

var objOrdServ = new OrderService(new OrderProcessingEngine()); 

IoC обычно осуществляется с помощью других механизмов, таких как AutoFac или Unity, чтобы назвать несколько.

+0

Контейнеры IoC - отличная помощь, но поскольку OP просто узнает об инъекции зависимостей, вначале это не так. –

+0

Да, полностью согласен. Вот почему я показал способ создать его вручную, а также упомянуть несколько фреймворков для проверки. –

+0

Я думал, что идея инъекции зависимостей не означает, что класс А зависит от класса B. Выполняет это var objOrdServ = new OrderService (новый OrderProcessingEngine()); не нарушать правило ??? – user2320476

1

Для инъекции зависимостей, вы должны фактически вводить зависимый объект.

Где у вас есть

OrderService objOrdServ = new OrderService(); 

в вашем коде, вам необходимо предоставить экземпляр - у вас есть конструктор, который принимает параметр типа базового интерфейса, так что если вы

OrderService objOrdServ = new OrderService(new OrderProcessingEngine()); 

, то переменная класса _iordProc будет ссылаться на экземпляр вашего требуемого класса.

Редактировать: Я ввел неправильные строки кода в свой ответ - исправлено сейчас.

+0

Его класс 'Order' не имеет такого конструктора, вы имели в виду' OrderService'? – neontapir

+0

@neontapir Да, я спешил и полностью поместил неправильный код, но подумал, что я его заметил и исправил, прежде чем кто-нибудь заметит. Я вижу, что тапир быстрее реагирует, чем я! –

Смежные вопросы