猿问

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

最近,在 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 中实现类似的行为?


德玛西亚99
浏览 232回答 2
2回答

慕娘9325324

.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 事务工具中,该范围已被释放/提交。
随时随地看视频慕课网APP
我要回答