2013-09-24 2 views
4

Я пытаюсь понять концепцию впрыскивания зависимостей. Ниже приведен пример, который я пытаюсь отлаживать. Здесь я создал класс Customer, зависимости которого у меня есть Injected в его конструкторе Теперь, когда я вызвал this.Iorder.GetOrderDetails(); в методе Index, он дает мне ошибку NullReferenceException и просит использовать ключевое слово new, чтобы создать объект для вызова метода. Когда я переместил этот вызов this.Iorder.GetOrderDetails(); на другой метод GetCutomerDetails() и вызвал этот метод в методе индекса, он работает.Зависимость впрыска и использование конструктора по умолчанию

Вопрос: Я не могу понять, почему this.Iorder.GetOrderDetails() метод вызова не работает в Index метод и почему она работает в GetCutomerDetails()

public interface IorderDetails 
{ 
    void GetOrderDetails(); 
} 

public class CustomerModel : IorderDetails 
{ 
    public void GetOrderDetails() {} 
} 

Контроллер:

public class CustomerController: Controller 
{ 
    private IorderDetails Iorder; 

    //DI constructor Injecting OrderDetails object 
    CustomerController(IorderDetails iorderObj) 
    { 
     if (iorderObj == null) 
      throw new ArgumentNullException("orderObj should not be null"); 

     this.Iorder = iorderObj; 
    } 
    //Default constructor 
    public CustomerController() { } 

    public ActionResult Index() 
    {    
     CustomerController objCustomer = new CustomerController(new CustomerModel()); 
     objCustomer.GetCutomerDetails(); 

     //Commented GetOrderDetails() method 
     //this.Iorder.GetOrderDetails();    
     return View(); 
    } 

    public ActionResult GetCutomerDetails() 
    { 
     this.Iorder.GetOrderDetails(); 
     return View(); 
    } 
} 
+1

Вы имеете в виду dependEncy injection? –

+0

Что вы используете для ввода IOrderDetails в класс CustomerController? – stuartmclark

+0

Удалить конструктор по умолчанию, и вы увидите, почему ваш код не работает в методе индекса. –

ответ

2

У вас есть по умолчанию конструктор для CustomerController. Когда он вызывается, вы ничего не назначаете Iorder. Таким образом, это null в этом случае. После этого в методе Index() вы пытаетесь выполнить метод GetOrderDetails() с использованием Iorder, который является нулевым. Это не удается. Когда вы создаете еще один экземпляр CustomerController внутри метода Index(), вы можете позвонить GetOrderDetails() на этом экземпляре.

В целом, использование нескольких конструкторов не рекомендуется в сочетании с впрыском зависимостей. Но когда это необходимо, вы должны инициализировать все поля экземпляра тем, что работает. Это называется локальным значением по умолчанию. Отличная книга по шаблонам зависимостей зависимостей и анти-шаблонам - Dependency Injection in .NET. Также взгляните на блог своего автора.

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