.NET Core DI scope lifetime in Ninject



编辑:由于许多用户错误地将此视为 ASP.NET 特定问题。请注意,我的应用程序不是 Web 应用程序,也没有使用 ASP.NET 应用程序(我正在使用它的功能,在 .NET Core 中也可用(。


最近,在Ninject DI中配置实体框架DbContext生存期时,我一直在挖掘.NET Core Dependency Injection,因为它已经具有注册DbContext的功能,可以在这里找到。默认上下文生存期为ServiceLifetime.Scoped

在代码窥视中,我们可以读到在 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
}
}

我正在尝试在 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中实现类似的行为?

.NET Core DI 范围生存期设置如何工作以及它是什么 生命周期?

.Net core内部与名为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?

编辑:

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

  • 如果为 DbContext 指定单一实例生存期,则只有一个 创建,由 DI 在请求时提供,并在内存中保留 整个应用程序/容器生存期。
  • 如果指定瞬态,则得到新的 一个一直请求 DbContext。
  • 如果指定作用域, DbContext 的生存期绑定到某个一次性作用域,该作用域是在某个逻辑请求(如果是 asp 的情况下为 http 请求(开始时创建的。当 DbContext 为 第一次由 DI 请求,创建新的,保存在内存中,并且在期间始终相同 后续 DI 请求,直到范围被释放(在 asp 的情况下,http 请求结束(和 DbContext 与 它。

您可以找到与 TransactionScope 类似的相似之处。在这里,同一事务范围内的所有 sqlCommand都登记到释放/提交范围的同一 sql 事务实用程序中。

有一个名为InRequestScope的扩展方法,该方法在Ninject.Web.Common nuget包中可用。

请求范围 : https://github.com/ninject/Ninject.Web.Common/wiki/InRequestScope

您可以关联 .net 核心和注入 DI 方法 与 https://github.com/ninject/Ninject/wiki/Object-Scopes 相比

最新更新