【发布时间】:2011-07-08 17:07:07
【问题描述】:
在与 Remo Gloor(主要开发人员)讨论了我们的 Ninject 配置 .NET memory profiling / risks for leaks / Ninject / Direct delegate roots 之后,我想弄清楚如何为 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 中进行配置?
我们是否也应该使用:
为了确保我们的对象被正确处理?
这对某些人来说可能看起来很简单,但我只想说明每个人都采取的方法。
谢谢
【问题讨论】:
标签: .net asp.net dependency-injection ninject