2010-11-11 8 views
2

Я новичок в Ninject и пытаюсь понять реализацию. Я ищу и читаю, может ли кто-нибудь указать мне на некоторые хорошие примеры и документацию, относящуюся к Ninject и MVC.Ninject 101 для MVC

Я могу заставить основы работать, я борюсь с привязками, которые имеют зависимости. Например, у меня есть следующие классы:

public class ScheduleService : IScheduleService 
    { 
     private IValidationDictionary validationDictionary; 
     public ScheduleService(IValidationDictionary validationDictionary) 
     { 
      this.validationDictionary = validationDictionary; 
     } 
    } 

Это зависит от:

public class ModelStateWrapper : IValidationDictionary 
    { 
     private ModelStateDictionary _modelState; 

     public ModelStateWrapper(ModelStateDictionary modelState) 
     { 
      _modelState = modelState; 
     } 

То, что я хочу создать привязки для:

Bind<IValidationDictionary>() 
        .To<ModelStateWrapper>(); 

       Bind<IScheduleService>() 
        .To<ScheduleService>(); 

Как настроить привязки так мои контроллер может использовать ScheduleService? Как он получает ModelState?

Уточнение: Я хочу ввести это в класс обслуживания расписания, который обрабатывает бизнес-логику. У меня работает Ninject, просто не уверен, как обрабатывать зависимости. Ниже приведен код моего контроллера.

public class ScheduleController : ActivityController 
{ 
    private IScheduleService scheduleService; 


    public ScheduleController(IScheduleService scheduleService) 
    { 
     this.scheduleService = new ScheduleService(new ModelStateWrapper(this.ModelState)); 
    } 

Спасибо за ваше терпение, возможно, я не задаю правильный вопрос. Он строит, но когда я запускаю его, я получаю:

Ошибка активации IValidationDictionary Нет соответствующих привязок, и тип не является самопереключаемым. Путь Активации: 3) Инъекция зависимостей IValidationDictionary в параметре validationDictionary конструктора типа ScheduleService 2) Инъекция зависимостей IScheduleService в параметре scheduleService конструктора типа ScheduleController 1) запрос для ScheduleController

Предложений: 1) Обеспечить что вы определили привязку для IValidationDictionary. 2) Если привязка была определена в модуле, убедитесь, что модуль загружен в ядро. 3) Убедитесь, что вы случайно не создали несколько ядер. 4) Если вы используете автоматическую загрузку модуля, убедитесь, что путь поиска и фильтры правильные.

+0

Я бы, вероятно, передумал это решение. ModelState является чем-то контекстуальным для конкретного действия и поэтому не может быть внедрен на глобальном уровне. –

+0

Это также может быть актуально: http://stackoverflow.com/questions/4127184/ninject-error-he-icontrollerfactory-ninject-web-mvc-ninjectcontrollerfactory-d/4127715#4127715 –

ответ

1

1 вещь, которую вы можете рассмотреть, - это инъекция фабрики для производства словаря IValidationDictionary. например, ваш конструктор контроллера будет принимать IValidationFactory, а у IValidationFactory есть один метод: GetValidation (ModelStateDictionary modelState), и ваша реализация по умолчанию возвращает ваш ModelStateWrapper. это позволяет вам полный IoC, и вы можете вводить свои собственные заглушки для модульного тестирования.

Если есть один или два метода на IValidationDictionary, вы также можете просто передать ModelState в вызываемые методы, вместо того, чтобы вставлять его в конструктор.

+0

Не могли бы вы показать код этого. Я не могу этого сделать (ваша первая часть, не передавая его методом) – chobo2

+0

после повторного чтения исходного вопроса и размышления об этом больше, я думаю, что мой ответ неверен или недействителен. он просит ввести IScheduleService с ModelStateWrapper, а не с контроллером. потому что контроллер не имеет никакого контроля над созданием службы расписания, нет способа получить его ModelState. если бы мне пришлось это сделать в моем приложении, я бы передал ModelStateWrapper в качестве аргумента IValidationDictionary для метода, который вызывается в IScheduleService. –

+0

Можете ли вы уточнить свою последнюю строку? – chobo2

3

ли вы имеете в виду что-то вдоль линий:

Настройка Ninject2

public class MvcApplication : NinjectHttpApplication 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     //Here goes routing setup 
    } 

    protected override void OnApplicationStarted() 
    { 
     RegisterRoutes(RouteTable.Routes); 
     RegisterAllControllersIn(Assembly.GetExecutingAssembly()); 
    } 

    protected override IKernel CreateKernel() 
    { 
     return new StandardKernel(new ServiceModule()); 
    } 
} 

internal class ServiceModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IValidationDictionary>().To<ModelStateWrapper>(); 
     Bind<IScheduleService>().To<ScheduleService>(); 
    } 
} 

Инъекция в контроллер

public class HomeController : Controller 
{ 
    private readonly IValidationDictionary _validationDictionary; 
    private readonly IScheduleService _scheduleService; 

    public HomeController(IValidationDictionary validationDictionary, IScheduleService scheduleService) 
    { 
     _validationDictionary = validationDictionary; 
     _scheduleService = scheduleService; 
    } 
} 
1

Вы не можете это сделать. Модельное состояние - это то, что задается контроллером при его инициализации. Я не знаю Ninject, но вы должны иметь возможность выполнять контекстное разрешение вашего сервиса и передавать ему текущее состояние модели. Это не очень хорошее решение, и я бы не рекомендовал его.

В основном ваша проблема заключается в том, что Ninject не знает, как решить ModelStateDictionary, как вы не сказали, как это сделать. Если зависимость от класса modelstatewrapper была чем-то еще, что не является контекстуальным, вам просто нужно установить это в Ninject, чтобы заставить его работать.

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