首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >配置Ninject

配置Ninject
EN

Stack Overflow用户
提问于 2011-07-09 01:07:08
回答 1查看 2.5K关注 0票数 2

在与Remo Gloor (主开发人员)讨论了我们的.NET memory profiling / risks for leaks / Ninject / Direct delegate roots配置之后,我想澄清一下如何为ASP.NET webforms应用程序正确地配置它。

我们目前有一个要求,我们正在做以下工作:

代码语言:javascript
复制
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是我们拥有的一种扩展方法:

代码语言:javascript
复制
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中对其进行配置?

我们是否也应该使用:

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

来确保我们的对象被正确地放置?

对一些人来说,这可能看起来相当简单,但我只想弄清楚每个人都采取的方法。

谢谢

EN

回答 1

Stack Overflow用户

发布于 2011-07-09 02:14:55

在装饰的情况下,使用一些条件绑定(例如,WhenParentNamed,WhenClassHas,WhenTargetHas或custon When)是最好的方式。

代码语言:javascript
复制
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开发版本),就必须使用它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6627894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档