.net 配置Ninject

.net 配置Ninject,.net,asp.net,dependency-injection,ninject,.net,Asp.net,Dependency Injection,Ninject,在与Remo Gloor(主开发人员)讨论了Ninject配置之后,我想了解一下如何为ASP.NET webforms应用程序正确配置它 我们目前有一项要求,我们正在做以下工作: Bind<ISearchService>() .ToMethod(ctx => new BaseSearchService(ctx.Kernel.GetDefault<IDataRetrievalService>())) .InSingletonScope() .N

在与Remo Gloor(主开发人员)讨论了Ninject配置之后,我想了解一下如何为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();
Bind()
.ToMethod(ctx=>newbasesearchservice(ctx.Kernel.GetDefault())
.InSingletonScope()
.命名为(“BaseSearchService”);
绑定()
.ToMethod(ctx=>新的HttpSearchService(
ctx.Kernel.GetNamedOrDefault(“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);
}
publicstatict GetDefault(此IKernel内核)
{
返回kernel.Get(m=>m.Name==null);
}
公共静态对象GetDefault(此IKernel内核,类型)
{
返回kernel.Get(type,m=>m.Name==null);
}
公共静态T GetNamedOrDefault(此IKernel内核,字符串名)
{
T result=kernel.TryGet(名称);
如果(结果!=null)
返回结果;
返回kernel.GetDefault();
}
公共静态对象GetNamedOrDefault(此IKernel内核,类型,字符串名)
{
var result=kernel.TryGet(类型、名称);
如果(结果!=null)
返回结果;
返回kernel.GetDefault(type);
}
在Ninject中,我们如何最好地表达这一点?我们是否应该使用“WhenParentNamed”并让Ninject决定传递给构造函数的对象

同样,我们如何绑定当前HttpContext.current对象,以便Ninject知道在构造函数将HttpContext对象作为其参数之一时使用它?应该和这里看到的一样吗

如果我们正在使用请求范围,我们是否应该使用OnePerRequestModule并在应用程序的Web.config中配置它

我们是否也应该使用:

确保我们的物品得到妥善处理

对一些人来说,这似乎太简单了,但我只想明确每个人都采取的方法


感谢您使用一些条件绑定(例如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);
Bind()
.至()
.InSingletonScope()
.WhenParentNamed(“HttpServiceDecorator”);
绑定()
.至()
.命名(“HttpServiceDecorator”)
.InRequestScope();
Bind().ToMethod(ctx=>HttpContext.Current);
获取服务的最佳方法是将其注入到需要它的类的构造函数中。接收HttpSearchService实例没有什么特别的必要。它将作为默认值传递

由于Ninject.Web2.2,默认情况下使用OnePerRequestModule。所以不需要改变


Ninject.Web.Common是为即将发布的Ninject 2.4版本引入的。它是所有web扩展都使用的基本组件。这意味着,只要你继续使用2.2,你就不能使用它。一旦切换到2.4(或2.3开发版本),您就必须使用它。

谢谢Remo-我所要做的就是为我的decorator模式实现配置绑定。我希望始终使用一个不带名称的Get-on-the-kernel或服务定位器。返回的内容将由配置决定。我已经在WhenInjectedTo条件下实现了这一点,但目前还看不出上面的方法是如何工作的。我想我需要使用名称-HttpServiceDecorator来请求它?不,您不必指定名称。HttpServiceService将无条件返回。名称只是元数据,它本身绝对不会消亡。另外,还要去掉ServiceLocation并开始使用Ninject作为IoC容器。请参阅Ninject.Web扩展将允许您创建一个设计,其中您需要知道容器存在的唯一地方是配置。