你了解.NET Core 应用程序中的服务生存期吗?

作者:微信公众号:【架构师老卢】
3-18 16:3
26

概述:在 .NET Core 应用程序中,尤其是在使用依赖项注入 (DI) 时,了解各种服务生存期至关重要。服务的生存期决定了它在应用程序中的存在时间以及实例的管理方式。在本文中,我们将探讨 .NET Core 中可用的三个主要生存期:单一实例、作用域和瞬态。单例寿命单一实例生存期意味着在应用程序的整个生存期内,将只创建和共享一个服务实例。这意味着每次请求服务时,都会返回相同的实例。services.AddSingletonIMyService, MySingletonService();让我们看一个单一实例服务的示例:public class MySingletonService : IMySer

在 .NET Core 应用程序中,尤其是在使用依赖项注入 (DI) 时,了解各种服务生存期至关重要。服务的生存期决定了它在应用程序中的存在时间以及实例的管理方式。在本文中,我们将探讨 .NET Core 中可用的三个主要生存期:单一实例、作用域和瞬态。

单例寿命

单一实例生存期意味着在应用程序的整个生存期内,将只创建和共享一个服务实例。这意味着每次请求服务时,都会返回相同的实例。

services.AddSingleton<IMyService, MySingletonService>();

让我们看一个单一实例服务的示例:

public class MySingletonService : IMyService  
{  
    private readonly Guid _instanceId;  
  
    public MySingletonService()  
    {  
        _instanceId = Guid.NewGuid();  
    }  
  
    public Guid GetInstanceId()  
    {  
        return _instanceId;  
    }  
}

在此示例中,无论注入到其他组件中多少次,它们都将收到相同的 .IMyServiceMySingletonService

作用域生存期

作用域生存期意味着将为每个作用域创建一个新的服务实例。在 ASP.NET Core 应用程序中,作用域通常对应于 HTTP 请求。这可确保每个请求都获得自己的服务实例,并在作用域(请求)的末尾释放实例。

services.AddScoped<IMyService, MyScopedService>();

让我们看一个作用域服务的示例:

public class MyScopedService : IMyService  
{  
    private readonly Guid _instanceId;  
  
    public MyScopedService()  
    {  
        _instanceId = Guid.NewGuid();  
    }  
  
    public Guid GetInstanceId()  
    {  
        return _instanceId;  
    }  
}

在此示例中,每个 HTTP 请求都将获得一个单独的 实例,该实例将在请求结束时被释放。MyScopedService

瞬态寿命

瞬态生存期意味着每次请求服务时都会创建一个新的服务实例。这对于轻量级服务或生命周期较短的服务非常有用。

services.AddTransient<IMyService, MyTransientService>();

让我们看一个瞬态服务的示例:

public class MyTransientService : IMyService  
{  
    private readonly Guid _instanceId;  
  
    public MyTransientService()  
    {  
        _instanceId = Guid.NewGuid();  
    }  
  
    public Guid GetInstanceId()  
    {  
        return _instanceId;  
    }  
}

在此示例中,每次注入时,都会创建一个新的实例 。

选择合适的寿命

为服务选择适当的生存期取决于各种因素,例如性能、资源使用情况和行为要求。这里有一个简短的指南:

  • 当服务实例可以在整个应用程序之间共享并且是无状态的时,请使用 Singleton。
  • 当每个 HTTP 请求或每个逻辑操作范围都需要服务实例时,请使用 Scoped。
  • 当每次请求服务实例时都需要创建服务实例并且不应共享服务实例时,请使用瞬态。

了解这些生存期对于在 .NET Core 应用程序中有效使用依赖项注入、确保适当的资源利用率和行为一致性至关重要。

在选择适当的使用寿命时,请记住考虑应用程序的要求和特性。

相关留言评论
昵称:
邮箱:
阅读排行