gpt4 book ai didi

asp.net-mvc-3 - 何时应该在 Ninject.MVC3 中使用 Kernel.BeginBlock()

转载 作者:行者123 更新时间:2023-12-02 19:40:46 25 4
gpt4 key购买 nike

我正在将 Ninject.MVC3 与 WebAPI 结合使用。最初,我使用了 NinjectResolverNinjectScope 的实现,如here所述。 ,IE。使用_kernel.BeginBlock(),我注意到每次调用 Controller 时都会调用 BeginBlock() 。在对 Controller 进行负载测试(超过数百次调用)时,我注意到 w3wp 的内存消耗显着增加(高负载时高达 1.4 GB),并且 GC 永远不会回收任何内存。

this SO post不应处置内核并且不应使用BeginBlock()。接下来我更新了解析器和范围,如下所示:

 public class NinjectScope : IDependencyScope
{
protected IResolutionRoot resolutionRoot;

public NinjectScope(IResolutionRoot kernel)
{
resolutionRoot = kernel;
}

public object GetService(Type serviceType)
{
IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true);
return resolutionRoot.Resolve(request).SingleOrDefault();
}

public IEnumerable<object> GetServices(Type serviceType)
{
IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true);
return resolutionRoot.Resolve(request).ToList();
}

public void Dispose()
{
//Don't dispose the kernel
//IDisposable disposable = (IDisposable)resolutionRoot;
//if (disposable != null) disposable.Dispose();
//resolutionRoot = null;
}
}

public class NinjectResolver : NinjectScope, IDependencyResolver
{
private IKernel _kernel;
public NinjectResolver(IKernel kernel): base(kernel)
{
_kernel = kernel;
}
public IDependencyScope BeginScope()
{
return new NinjectScope(_kernel);
//what's the difference between using just _kernel vs _kernel.BeginBlock()
//return new NinjectScope(_kernel.BeginBlock());
}
}

经过此更改(即使用上述实现),内存消耗显着降低。我想了解这是为什么。BeginBlock() 的真正作用是什么以及何时应该使用它。

上面的实现准确吗?

最佳答案

Remo Gloor 表示 ActivationBlock 概念已被破坏,您不应该使用它们。此外,有关 ActivationBlock 的问题很可能不会得到修复,因为该功能将从 future 的 Ninject 版本中删除。

激活 block (当前实现)的想法是:

  • ActivationBlock 中请求的每种类型创建一个实例
  • 当 block 本身被释放时,释放由 ActivationBlock 创建的所有实例。

另请参阅:

此外,您已使用“MVC3”标记并命名您的问题,但 System.Web.Http.Dependencies.IDependencyResolver您正在使用的接口(interface)与asp.net-web-api相关。 MVC 的 System.Web.Mvc.IDependencyResolver是不同的。

Ninject 已经提供了 nuget 包,可以集成到 asp.net-mvc-3 (4,5,...) 和 asp.net web api 中:

现在,如果您确实想自己实现依赖项解析器和作用域,我们可以将其与 ninject 的 web-api 实现进行比较:

与您的代码唯一真正的区别在于,它们有一个类同时实现 IDependencyResolverIDependencyScope,并且它们始终使用 IResolutionRoot > 而不是 IKernel 接口(interface)。

(用于比较: MVC3 NinjectDependencyResolver.cs )

关于asp.net-mvc-3 - 何时应该在 Ninject.MVC3 中使用 Kernel.BeginBlock(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26708979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com