Ninject 101 для MVC - PullRequest
       1

Ninject 101 для MVC

2 голосов
/ 11 ноября 2010

Я новичок в Ninject и пытаюсь выяснить реализацию. Я ищу и читаю, может кто-нибудь указать мне несколько хороших примеров и документации, специфичной для Ninject и 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) Если вы используете автоматическую загрузку модуля, убедитесь в правильности пути поиска и фильтров.

Ответы [ 3 ]

3 голосов
/ 11 ноября 2010

Вы имеете в виду что-то вроде:

Настройка 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 голос
/ 15 ноября 2010

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

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

1 голос
/ 11 ноября 2010

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

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

...