当前位置: 首页 > 知识库问答 >
问题:

Ninject中的.NET核心DI作用域生存期

向泽语
2023-03-14

最近,在Ninject DI中配置实体框架DbContext生存期时,我一直在挖掘.NET核心依赖项注入,因为它已经具有注册DbContext的功能,可以在这里找到。默认上下文生存时间为ServiceLifeTime.scoped

在代码peek中,我们可以读到在ASP.NET应用程序中,“作用域”的意思是:

范围是围绕每个服务器请求创建的

namespace Microsoft.Extensions.DependencyInjection
{
    //
    // Summary:
    //     Specifies the lifetime of a service in an Microsoft.Extensions.DependencyInjection.IServiceCollection.
    public enum ServiceLifetime
    {
        //
        // Summary:
        //     Specifies that a single instance of the service will be created.
        Singleton = 0,
        //
        // Summary:
        //     Specifies that a new instance of the service will be created for each scope.
        //
        // Remarks:
        //     In ASP.NET Core applications a scope is created around each server request.
        Scoped = 1,
        //
        // Summary:
        //     Specifies that a new instance of the service will be created every time it is
        //     requested.
        Transient = 2
    }
}
  • .NET核心DI作用域生命周期设置是如何工作的,它的生命周期是什么?
  • 在Ninject DI中是否可能实现类似的行为?

共有1个答案

松兴邦
2023-03-14

NET核心DI作用域生命周期设置是如何工作的,它的生命周期是什么?

.NET核心在内部使用名为serviceScope的类。当调用新的请求(例如web请求)时,将创建新的实例,其中包括新的服务提供者。在请求期间,此服务提供程序用于依赖关系解析。请求完成后,作用域将被处置,作用域的服务提供者也将被处置,作用域的服务提供者也将被处置。

  internal class ServiceScope : IServiceScope, IDisposable
  {
    private readonly Microsoft.Extensions.DependencyInjection.ServiceProvider _scopedProvider;

    public ServiceScope(Microsoft.Extensions.DependencyInjection.ServiceProvider scopedProvider)
    {
      this._scopedProvider = scopedProvider;
    }

    public IServiceProvider ServiceProvider
    {
      get
      {
        return (IServiceProvider) this._scopedProvider;
      }
    }

    public void Dispose()
    {
      this._scopedProvider.Dispose();
    }
  }

是否可能在Ninject DI中实现类似的行为?

正如您已经注意到的那样,实现自定义作用域是一条必经之路。您可以在另一个答案中查看如何执行此操作:

Ninject-当RequestScope没有意义时,应该在什么范围中绑定DbContext?

编辑:

    null
 类似资料:
  • 我想知道,当我们为客户提供新的更新时,是否有丢失这些文件的风险。如果有更好的解决方案,上传文件和获取文件链接之后,与.NET core请告诉我:)

  • .NET核心和ASP.NET核心到底有什么区别?

  • 为什么通过或请求服务被认为是不良做法。我可以到处阅读这条语句: 建议使用构造函数注入,而不是使用RequestServices获取它。 我的想法正好相反。尽可能使用Request estServices。让我解释一下为什么。我想让控制器尽可能小,这样我就可以创建单独的服务。这样,我的控制器就干净了: 所有服务都继承自base,其中包含用于管理权限、缓存sql请求的逻辑…… 使用构造函数方法,我得到

  • 从sln目录工程 从解决方案目录工作 我不希望VS 2017必须安装在构建机器上,所以我从 https://www.visualstudio.com/downloads/ 安装了“Visual Studio 2017的构建工具”。 轰炸sln中的每个项目,错误如下: 错误 MSB4019:找不到导入的项目“C:\Program Files (x86)\Microsoft Visual Studio

  • 我读过关于.NET标准和.NET核心之间的区别,但我真的不知道区别是什么,也不知道什么时候选择.NET标准库项目,什么时候选择.NET核心库项目。

  • 我刚起步 (更新:解决方案是将UseRouting移动到/api/error路由下) 但是当时,永远不会调用错误控制器方法。