为了账号安全,请及时绑定邮箱和手机立即绑定

Ninject 中的 .NET Core DI 作用域生命周期

Ninject 中的 .NET Core DI 作用域生命周期

PHP
德玛西亚99 2021-09-19 15:38:42
最近,在 Ninject DI 中配置 Entity Framework DbContext 生存期时,我一直在挖掘 .NET Core 依赖注入,因为它已经具有注册 DbContext 的功能,可以在这里找到。默认上下文生命周期为ServiceLifetime.Scoped.在代码一览中,我们可以看到在 ASP.NET 应用程序中,“scoped”意味着:范围是围绕每个服务器请求创建的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    }}我正在尝试在 Ninject DI 中实现类似的功能,但在谈到 .NET Core 应用程序(这不是 Web 应用程序!)时,很难说明 Ninject 中的作用域生命周期相当于什么。Ninject 有InRequestScope方法,但它仅适用于 Web 应用程序,因此它与 .NET Core DIServiceLifetime.Scoped设置确实不同。也许我必须在 Ninject 中创建某种自定义范围,但是 - 我仍然无法说明如何实现与 .NET Core DI 中完全相同的范围行为。为此,我需要了解范围生命周期在 .NET Core DI 中的 .NET Core 应用程序上下文中是如何工作的。我的猜测是,有一个 DbContext 实例正在被创建,一旦应用程序退出就会被释放。因此我的问题:.NET Core DIscope生命周期设置是如何工作的?它的生命周期是什么?是否有可能在 Ninject DI 中实现类似的行为?
查看完整描述

2 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

.NET Core 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 中实现类似的行为?

正如您已经注意到的那样,实现自定义范围是可行的。

编辑:

.NET Core DI 的原理与任何其他 IOC 容器相同。它通过 DI 为您的对象(MVC 控制器等)提供依赖项并控制其生命周期。

  • 如果您为 DbContext 指定单例生命周期,则仅创建一个,由 DI 在请求时提供,并在整个应用程序/容器生命周期内保留在内存中。

  • 如果您指定瞬态,则在请求 DbContext 的所有时间都会获得新的。

  • 如果指定范围,则 DbContext 的生命周期将绑定到某个一次性范围,该范围是在某些逻辑请求(asp 中的 http 请求)开始时创建的。当 DI 第一次请求 DbContext 时,会创建新的,保存在内存中,并且在后续 DI 请求中始终保持不变,直到范围被释放(在 asp 的情况下为 http 请求结束)和 DbContext 与它。

您可以找到与 TransactionScope 类似的并行。此处,同一个 TransactionScope 中的所有 sqlCommand 都被登记到同一个 sql 事务工具中,该范围已被释放/提交。


查看完整回答
反对 回复 2021-09-19
  • 2 回答
  • 0 关注
  • 231 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信