Инжекция свойства в Основном Контроллере с помощью Ninject 2

У меня есть следующий код в моем Global.aspx

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

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

У меня также есть следующий Модуль Ninject:

internal class ServiceModule : NinjectModule
{
    public override void Load()
    {
        Bind<IProductService>().To<ProductService>().InRequestScope();
    }
}

У меня также есть основной контроллер:

public class BaseController : Controller
{
    [Inject]
    public IProductService ProductService
    {
        get;
        set;
    }
}

Этот код работы. Проблема, которую я имею, состоит в том, что я хотел бы удалить вводить атрибут из основного контроллера и указать это в Ninject ServiceModule вместо этого. Я другие слова, как я пошел бы о записи обязательного правила в ServiceModule, который говорит Ninject вводить ProductService в свойство в основном контроллере?

Если я удалю атрибут, то я получу NullReferenceException.

5
задан Thomas 30 June 2010 в 23:48
поделиться

1 ответ

Связывание на основе соглашений существует в http://github.com/ninject/ninject.extensions.conventions - один реализует IBindingGenerator . Однако это в значительной степени связано с обнаружением интерфейсов и сервисов.

В общем, внедрение конструктора - хороший подход по умолчанию. Однако способ, которым работает ASP.NET MVC, усложняет выполнение этой задачи (следовательно, FubuMVC и т. Д.). Так что инъекция свойств - следующий лучший вариант.

Вы можете обнаружить, что использование OnActivation в вашем Bind может позволить вам сделать достаточно - и если вы можете, это самый простой вариант.

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

  • выбор того, что вы собираетесь вводить автоматически. Вы собираетесь выкладывать все, что не является конкретным? Все, о чем знает ваше ядро? Если вы не дадите четкого определения того, что вы хотите делать, процесс инъекции может стать непредсказуемым и трудным для понимания. Вы в конечном итоге отлаживаете и много объясняете коллегам.

  • что делает его эффективным. Ninject динамически генерирует код за кулисами, чтобы сделать активацию экземпляра эффективной (т. Е. Во время прохождения класса, ищущего маркеры [Inject] , он генерирует код один раз для выполнения этого, который затем запускается, как если бы вы бы написали это от руки).

Заглянув в код, нет простого способа OOTB. Похоже, добавление пользовательской IInjectionHeuristic поможет.

Однако, если вы глубоко погружаетесь в контейнеры, вам нужно

  1. сделать паузу и посмотреть, сможете ли вы сохранить простоту, не идя по этой дороге
  2. , перейдите в список рассылки ninject и поищите похожие вещи
  3. , если вы все еще хотите это сделать, отправьте письмо туда.
3
ответ дан 14 December 2019 в 18:56
поделиться
Другие вопросы по тегам:

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