.NET Core 依赖注入实例何时被释放?

2023-11-29

ASP.NET Core 使用扩展方法IServiceCollection设置依赖注入,然后当需要类型时,它使用适当的方法创建一个新实例:

  • AddTransient<T>- 添加每次请求时再次创建的类型。
  • AddScoped<T>- 添加为请求范围保留的类型。
  • AddSingleton<T>- 在第一次请求时添加类型并保留它。

我有实现的类型IDisposable如果不处理它们就会导致问题 - 在每种模式中Dispose真的打电话了?

是否需要添加任何内容(例如异常处理)以确保实例始终被释放?


解析的对象与它们的容器具有相同的生命周期/处置周期,除非您使用以下命令在代码中手动处置瞬态服务using声明或.Dispose()方法。

在 ASP.NET Core 中,您将获得一个作用域容器,该容器根据请求实例化并在请求结束时被释放。此时,由该容器创建的作用域和瞬态依赖项也将被释放(也就是说,如果它们实现IDisposable接口),您也可以在源代码中看到here.

public void Dispose()
{
    lock (ResolvedServices)
    {
        if (_disposeCalled)
        {
            return;
        }
        _disposeCalled = true;
        if (_transientDisposables != null)
        {
            foreach (var disposable in _transientDisposables)
            {
                disposable.Dispose();
            }

            _transientDisposables.Clear();
        }

        // PERF: We've enumerating the dictionary so that we don't allocate to enumerate.
        // .Values allocates a ValueCollection on the heap, enumerating the dictionary allocates
        // a struct enumerator
        foreach (var entry in ResolvedServices)
        {
            (entry.Value as IDisposable)?.Dispose();
        }

        ResolvedServices.Clear();
    }
}

当父容器被释放时,单例也会被释放,通常意味着当应用程序关闭时。

TL;DR:只要您在应用程序启动期间不实例化作用域/瞬态服务(使用app.ApplicationServices.GetService<T>())并且您的服务正确实现 Disposable 接口(例如MSDN中指出)没有什么需要你照顾的。

父容器在以下时间之外不可用Configure(IApplicationBuilder app)方法,除非你做了一些时髦的事情来使其可以在外部访问(无论如何你不应该这样做)。

当然,我们鼓励尽快释放临时服务,尤其是在它们消耗大量资源的情况下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.NET Core 依赖注入实例何时被释放? 的相关文章

  • 在后台有 npm 监视文件以启用与 Visual Studio Task Runner 的集成

    我试图让 npm 监视我的客户端代码中的文件更改 我可以让它在命令行中工作 但我真的希望它能在 Visual Studio 任务运行器中工作 我的 package json 看起来像这样 watch compile patterns www
  • 是否可以将 TeamCity 配置为使用 Visual Studio 2015 附带的 MSBuild?

    我正在尝试在 TeamCity 中构建 ASP NET vNext 项目 当它尝试构建时 我收到以下错误 C MyApp kproj 7 3 error MSB4019 The imported project C Program File
  • @Inject 和 @PostConstruct 不适用于单例模式

    我有一堂课如下 public class UserAuthenticator private static UserAuthenticator authenticator Inject private UserRepository user
  • 使用 DI 将参数传递给 DbContext

    我想向 DBContext 传递一个附加参数 如下所示 string myParam xx string con connenctionstring services AddDbContext
  • 何时使用接口,何时使用高阶函数?

    给定一个具有以下层的 ASP NET MVC 应用程序 UI 视图 CSS Javascript 等 控制器 服务 包含业务逻辑和数据访问 没有单独的数据访问层的原因是我正在使用 SQL 类型提供程序 以下代码可能不起作用 因为它只是原始草
  • .NET7 Web API 中的 JSON 多态序列化

    NET7 包括许多改进System Text Json序列化器 其中之一是使用新的类型的多态序列化 JsonPolymorphic 属性 我正在尝试在我的 Asp Net Web API 中使用它 但是尽管模型已正确设置 但它似乎并未序列化
  • ASP Net Core 属性路由和双正斜杠

    正如所指出的here https stackoverflow com a 20524044 3129340 URL 中包含双斜杠是有效的 我有一个使用属性路由的 ASP Net Core 项目 一个名为GroupController用于处理
  • CallContext.LogicalGet/SetData 的 .NET Core 等效项

    我正在尝试将使用 CallContext LogicalGet SetData 的现有 net 应用程序迁移到 net core 当 Web 请求到达应用程序时 我会在 CallContext 中保存一个 CorrelationId 并且每
  • 如何在@FacesConverter中注入@EJB、@PersistenceContext、@Inject、@Autowired等?

    我怎样才能注入像这样的依赖项 EJB PersistenceContext Inject AutoWired等在一个 FacesConverter 在我的具体情况下 我需要通过注入 EJB EJB FacesConverter public
  • IDisposable,这真的很重要吗

    很久以前我就开始使用 C C 但我仍然有一个习惯 即确保正确清理所有资源 我始终确保在 IDisposable 类上调用 Dispose 并在包含一次性对象的类中实现 Dispose 模式 然而 在我的环境中 我或多或少是唯一一个这样做的人
  • 在 Razor Pages 中使用 @functions 块的错误和警告

    因为 helperASP NET Core Razor Pages 不再支持指令 我一直在使用 functions指令代替 functions void RenderTask Models Task task tr td class p c
  • .net 4.7 中的依赖注入?

    我对 DI 有哪些集成选项有点困惑 我发现它对于 net core 对于我的特定项目 来说非常简单 但我不需要构建跨平台应用程序 也看不到使用 core 的优势 但是 net 框架应用程序似乎仍然使用 Global asax 设置且没有 S
  • 抑制实体框架核心中的 SQL 查询日志记录

    我有一个使用实体框架核心的控制台 net core 应用程序 该应用程序使用日志框架写入文件和控制台 serviceProvider new ServiceCollection AddLogging AddDbContext
  • 在project.json .Net Core中本地管理nuget

    我不想依赖 nuget 服务来下载依赖项 我想在我的 Net Core 应用程序中本地下载并使用 nuget 包 是否可以 方法与之前相同 打开您的NuGet config https docs nuget org consume nuge
  • .NET 实体框架核心

    我已经阅读了过去两年中发布的几乎所有有关 EF 的其他问题 我下载其他软件包没有任何问题 只是实体框架不会为我安装 我什至尝试安装最新版本的 Nuget 并在我的项目目录中使用它的工具来恢复包 之后 我将这一行添加到我的 csproj 中
  • Dotnet“新”命令不适用于 Framework 4.5?

    我正在尝试使用 dotnet 创建 4 5 框架类库项目new命令如下 dotnet new classlib lang C f net45 o TestProject 错误 无效参数 f 网络45 net45 不是 f 框架 的有效值 如
  • aspnetcore 出现角度错误 NodeInitationException:节点调用在 60000 毫秒后超时

    我在用着yo generator aspnetcore spa一旦我运行应用程序 我就遇到了问题 处理请求时发生未处理的异常 NodeIncationException 节点调用在 60000 毫秒后超时 您可以通过设置更改超时持续时间 N
  • 如何在 VS2017/2015 中打开 .xproj 文件

    我有一个带有扩展名的 NET core 项目 xproj 当我在VS 2017中打开项目时 项目文件 xproj migrated to csproj 如何打开 xproj 文件 Visual Studio 2017 2015 我需要安装任
  • 同一服务器上的多个.NET版本

    所以我一直都知道在一台计算机 客户端或服务器 上运行多个版本的 NET 框架是可以的 这个问题 https stackoverflow com questions 407306 running many versions of net on
  • Dropwizard 和 Guice:注入环境

    我目前正在构建一个基于 Dropwizard Guice Jersey 的应用程序 其中数据库访问暂时由 JDBI 处理 我想要实现的是拥有典型的企业架构 其中资源访问服务类访问 DAO 类 而 DAO 类又访问数据库 如果能以正确的 DI

随机推荐