После обсуждения с 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
Чтобы убедиться, что наши объекты расположены правильно?
Некоторым это может показаться довольно упрощенным, но я просто хочу прояснить подход, который все используют.
Спасибо