在与Remo Gloor (主开发人员)讨论了我们的.NET memory profiling / risks for leaks / Ninject / Direct delegate roots配置之后,我想澄清一下如何为ASP.NET webforms应用程序正确地配置它。
我们目前有一个要求,我们正在做以下工作:
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“来决定传递给构造器的对象呢?
同样,我们如何绑定当前的HttpContext.Current对象,以便在构造函数将HttpContext对象作为其参数之一时使用该对象?它应该和这里看到的一样吗?
https://github.com/ninject/ninject.web.mvc/blob/master/mvc3/src/Ninject.Web.Mvc/MvcModule.cs
如果我们使用request作用域,我们是否应该使用OnePerRequestModule并在应用程序的Web.config中对其进行配置?
我们是否也应该使用:
来确保我们的对象被正确地放置?
对一些人来说,这可能看起来相当简单,但我只想弄清楚每个人都采取的方法。
谢谢
发布于 2011-07-09 02:14:55
在装饰的情况下,使用一些条件绑定(例如,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是为升级中的Ningject2.4版本引入的。它是所有web扩展使用的基础组件。这意味着只要你停留在2.2,你就不能使用它。一旦您切换到2.4 (或2.3开发版本),就必须使用它。
https://stackoverflow.com/questions/6627894
复制相似问题