Проектирование asp среднего размера mvc - использующий ninject и создающий объекты

Я думаю, что часть беспорядка прибывает из различия между понятием тега и реализацией в SVN. К SVN тег является ответвлением, которое является копией. Изменение тегов считают неправильным, и на самом деле инструменты как TortoiseSVN предупредят Вас, при попытке изменить что-нибудь с../tags/.. в пути.

7
задан Ruben Bartelink 7 April 2013 в 21:04
поделиться

2 ответа

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

В вашем вопросе я заметил одну вещь: ваш DomainContext создается с помощью IDomainService и используется другими объектами. Если объект службы домена является своего рода фабрикой для DomainContext , тогда у вас нет особой проблемы - это становится упражнением по настройке Ninject для предоставления конкретных объектов и внедрения зависимостей.

Здесь ' общее руководство по структурированию вашего приложения - имейте в виду, что я не полностью понимаю ваши интерфейсы и классы:

public class GlobalApplication : NinjectHttpApplication {
  protected override void RegisterRoutes(RouteCollection routes) {

    // Your normal route registration goes here ...

    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "Default",                                              
        "{controller}/{action}/{id}",                           
        new { controller = "Home", action = "Index", id = "" }  
    );

  }

  // This function is resposible for creating a Ninject kernel.  This is where 
  // the magic starts to happen.  
  protected override IKernel CreateKernel() {
    var modules = new IModule[] {
                                  new AutoWiringModule(),
                                  new AutoControllerModule(
                                        Assembly.GetExecutingAssembly()),
                                  new ServiceModule()
                                };

    return new StandardKernel(modules);
  }
}

Обратите внимание, что самый простой способ заставить Ninject работать - это унаследовать класс вашего приложения от Класс NinjectHttpApplication . Вам нужно будет изменить свой RegisterRoutes на метод переопределения, а также потребуется реализовать метод под названием CreateKernel . Метод CreateKernel отвечает за возврат ядра Ninject, которое само является контейнером IoC.

В методе CreateKernel предоставленный Ninject AutoControllerModule сканирует сборки для классов контроллера MVC и регистрирует их в контейнере. Это означает, что зависимости от этих контроллеров теперь могут быть введены Ninject, поскольку он стал поставщиком контроллера для приложения. Класс ServiceModule - это класс, который вам нужно создать, чтобы зарегистрировать все свои службы в Ninject. Я предполагаю, что это будет выглядеть примерно так:

internal class ServiceModule : StandardModule {
  public override void Load() {
    Bind<IDomainService>()
      .To<MyDomainService>()
      .Using<OnePerRequestBehavior>();

    Bind<DomainContext>()
      .ToMethod( ctx => ctx.Kernel.Get<IDomainService>().CurrentDomainContext )
      .Using<OnePerRequestBehavior>();

    Bind<IService>()
      .To<MyServiceType>()
      .Using<OnePerRequestBehavior>();
  }
}

Ninject имеет довольно выразительный свободный интерфейс для настройки. Обратите внимание, что каждый оператор в основном связывает конкретный класс с интерфейсом, который он реализует. Фраза «Использование» в операторе указывает ядру Ninject, что объект будет жить только в течение срока действия запроса. Так, например, это означает, что каждый раз, когда объект IDomainService запрашивается из ядра Ninject во время того же запроса, тот же объект будет возвращен.

Что касается объектов контекста, Я уверен, что ваша доменная служба создает эти контексты и действует как своего рода фабрика. В связи с этим я связал экземпляры DomainContext классов выше, которые будут созданы путем получения значения свойства с именем CurrentDomainContext из IDomainService . Это то, что делает лямбда выше. Приятная вещь в привязке «ToMethod» в Ninject заключается в том, что у вас есть доступ к объекту контекста активации Ninject, который позволяет вам разрешать объекты с помощью ядра. Это именно то, что мы делаем, чтобы получить текущий контекст домена.

Следующие шаги - убедиться, что ваши объекты правильно принимают зависимости. Например, вы говорите, что ITrainingService используется только в классе TrainingController . Так, в этом случае я должен гарантировать, что TrainingController имеет конструктор, который принимает параметр ITrainingService . В этом конструкторе вы можете сохранить ссылку на ITrainingService в переменной-члене. Пример:

public class TrainingController : Controller {
  private readonly ITrainingService trainingService;

  public TrainingController(ITrainingService trainingService) {
    this.trainingService = trainingService;
  }

  // ... rest of controller implementation ...
}

Помните, что Ninject уже зарегистрировал все ваши контроллеры в ядре Ninject, поэтому, когда этот контроллер будет создан и будут вызваны его действия, у вас будет ссылка на ITrainingService . переменной-члена trainingService.

Надеюсь, это поможет вам. Использование контейнеров IoC иногда может сбивать с толку. Обратите внимание, я настоятельно рекомендую вам ознакомиться с документацией Ninject - это очень хорошо написанное введение в Ninject, а также концепции DI / IoC. Я' Мы также не упомянули модуль AutoWiringModule, показанный выше; однако Нейт Кохари (создатель Ninject) опубликовал хорошую статью в своем блоге об этой функции.

Удачи!

10
ответ дан 7 December 2019 в 01:25
поделиться

Я не совсем уверен, полностью ли я понимаю вашу проблему, надеюсь, этот совет может помочь.

При использовании контейнера IoC вы позволяете контейнеру обрабатывать управление временем жизни объекта. Я использовал Castle Windsor и StructureMap только для внедрения зависимостей, поэтому я не могу дать вам конкретный пример того, как это сделать с помощью Ninject.

Просматривая документацию Ninject, я думаю, вы хотите посмотреть Activation Behaviors указать управление временем жизни объекта.

Надеюсь, это поможет.

0
ответ дан 7 December 2019 в 01:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: