2015-09-03 1 views
0

Я новичок в Injection Dependency и в настоящее время использую Ninject как мой DI. Я играл с приложением ASP.Net MVC 5 и читал «Pro ASP.NET MVC 5». Я следовал примерам в книге о том, как настроить и использовать Ninject. Ниже приведен код для моего регистра услуг:Ninject - Ошибка загрузки компонента Ninject ICache

private static void RegisterServices(IKernel kernel) 
    { 
     kernel.Bind<ICustomerRepository>().To<CustomerRepository>(); 
     kernel.Bind<ICustomerUserDataRepository>().To<CustomerUserDataRepository>(); 
    } 

Что касается моего контроллера у меня ниже:

public class CustomerController : Controller 
{ 
    private ICustomerRepository customerRepository; 

    public CustomerController(ICustomerRepository customerRepo) 
    { 
     this.customerRepository = customerRepo; 
    } 

    // GET: Customer 
    public ActionResult Index(int Id = 0) 
    { 
     Customer customer = customerRepository.GetCustomer(Id).First(); 

     return View(customer); 
    } 
} 

Это прекрасно работает, как ожидалось в книге. Тем не менее, я играл с другим кодом и хотел использовать Ninject для разрешения некоторых зависимостей. Например, я работаю над пользовательским помощником для одного из моих просмотров Razor. В моих хелперах коды у меня есть следующий:

 using (IKernel kernel = new StandardKernel()) 
     {     
      ICustomerUserDataRepository customerUserDataRepo = kernel.Get<ICustomerUserDataRepository>(); 

Когда я запускаю это, он жалуется, что нет привязки определяется для ICustomerUserDataRepository. Я предполагаю, что это потому, что я использую новое ядро ​​без определенных привязок. Я прочитал, что вам нужно загружать привязки в ядрах через модули. Так что я сделал следующее:

public class MyBindings : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<ICustomerUserDataRepository>().To<CustomerUserDataRepository>(); 
    } 
} 

я затем загрузить модуль при установке моего ядра ниже:

using (IKernel kernel = new StandardKernel(new MyBindings())) 
{     
     ICustomerUserDataRepository customerUserDataRepo = kernel.Get<ICustomerUserDataRepository>(); 

Это, однако, вызывает «Ошибка при загрузке Ninject компоненты ICACHE» сообщение об ошибке, когда я запустить приложение. Я был бы признателен за помощь в том, что я делаю неправильно и что я не понимаю. Я прочитал, что несколько определенных ядер могут вызвать эту ошибку. Разве я не предполагаю использовать новое ядро ​​в моем вспомогательном методе, поскольку он уже используется и привязан под RegisterServices()? Если да, я полагаю, чтобы получить доступ к существующему ядру в моем вспомогательном методе? Или я на правильном пути и нуждаюсь в новом ядре, загружающем определенные привязки в моем модуле? Спасибо.

ответ

0

Могу ли я использовать новое ядро ​​в моем вспомогательном методе, поскольку он уже используется и привязан под RegisterServices()?

правильный. вам нужно только одно ядро ​​или корень композиции для каждого приложения. Я бы предположил, что вместо того, чтобы пытаться получить доступ к зависимостям в вспомогательном методе, вы должны создать модель представления в своем контроллере (которая имеет доступ к зависимостям), а затем передать viewmodel в ваш вспомогательный метод.

+0

Благодарим за отзыв и попробуем! – mike

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

  • Нет связанных вопросов^_^