Конфигурирование Ninject - PullRequest
2 голосов
/ 08 июля 2011

После обсуждения с Remo Gloor (основным разработчиком) о нашей конфигурации Ninject, Профилирование памяти .NET / риски утечек / Ninject / Прямые корни делегатов , я хотел бы получить некоторую ясность по настройке правильно для приложения веб-форм ASP.NET.

В настоящее время у нас есть требование, по которому мы делаем следующее:

Bind<ISearchService>()
    .ToMethod(ctx => new BaseSearchService(ctx.Kernel.GetDefault<IDataRetrievalService>()))
    .InSingletonScope()
    .Named("BaseSearchService");

Bind<ISearchService>()
    .ToMethod(ctx => new HttpSearchService(
        ctx.Kernel.GetNamedOrDefault<ISearchService>("BaseSearchService"),
        HttpContext.Current))
    .InRequestScope();

GetNamedOrDefault - метод расширения, который у нас есть:

public static T GetDefault<T>(this IKernel kernel)
{
    return kernel.Get<T>(m => m.Name == null);
}

public static object GetDefault(this IKernel kernel, Type type)
{
    return kernel.Get(type, m => m.Name == null);
}

public static T GetNamedOrDefault<T>(this IKernel kernel, string name)
{
    T result = kernel.TryGet<T>(name);

    if (result != null)
        return result;

    return kernel.GetDefault<T>();
}

public static object GetNamedOrDefault(this IKernel kernel, Type type, string name)
{
    var result = kernel.TryGet(type, name);

    if (result != null)
        return result;

    return kernel.GetDefault(type);
}

Как лучше всего представлять это в Ninject? Должны ли мы использовать «WhenParentNamed» и позволить Ninject решить, какой объект передать конструктору?

Аналогично, как мы можем связать текущий объект HttpContext.Current, чтобы Ninject знал, как использовать это всякий раз, когда конструктор принимает объект HttpContext в качестве одного из своих параметров? Должно ли оно быть таким же, как здесь?

https://github.com/ninject/ninject.web.mvc/blob/master/mvc3/src/Ninject.Web.Mvc/MvcModule.cs

Если мы используем область запроса, следует ли нам использовать OnePerRequestModule и настроить его в Web.config приложения?

Должны ли мы также использовать:

https://github.com/ninject/Ninject.Web.Common/blob/master/src/Ninject.Web.Common/NinjectHttpApplication.cs

Чтобы убедиться, что наши объекты расположены правильно?

Некоторым это может показаться довольно упрощенным, но я просто хочу прояснить подход, который все используют.

Спасибо

1 Ответ

2 голосов
/ 08 июля 2011

В случае декорации лучше всего использовать условное связывание (например, WhenParentNamed, WhenClassHas, WhenTargetHas или custon When).

Bind<ISearchService>()
  .To<BaseSearchService>()
  .InSingletonScope()
  .WhenParentNamed("HttpServiceDecorator");

Bind<ISearchService>()
    .To<HttpSearchService>()
    .Named("HttpServiceDecorator")
    .InRequestScope();

Bind<HttpContext>().ToMethod(ctx => HttpContext.Current);

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

Начиная с Ninject.Web 2.2, модуль OnePerRequestModule используется по умолчанию. Поэтому никаких изменений не требуется.

Представлен Ninject.Web.Common для готовящейся к выпуску версии Ninject 2.4. Это базовый компонент, используемый всеми веб-расширениями. Это означает, что пока вы остаетесь на 2.2, вы не должны его использовать. Как только вы перейдете на версию 2.4 (или сборку разработки 2.3), вам придется ее использовать.

...