В ASP.NET внедрение зависимостей (DI) предоставляет три общих режима жизненного цикла службы: одноэлементный, временный и ограниченный. Эти шаблоны определяют, когда экземпляры службы создаются, когда они уничтожаются, а также их жизненный цикл внутри приложения.
services.AddSingleton<IMyService, MyService>();
services.AddTransient<IMyService, MyService>();
При настройке службы вы можете выбрать соответствующий шаблон жизненного цикла, чтобы гарантировать, что служба создается и уничтожается способом, отвечающим потребностям вашего приложения.
Область Singleton проще всего понять: это единственный глобальный экземпляр процесса. Области Transient и Scope не так просты для понимания, как области Singleton. Их различия подробно объяснены ниже на примерах.
Использование Scoped — распространенный выбор для сервисов, которым необходимо сохранять состояние между запросами. Как понять это предложение?
Мы создадим сервис, который сохраняет состояние во время каждого запроса и передает Transient
и Scoped
Шаблоны жизненного цикла для сравнения их поведения.
Предположим, есть простой сервис подсчета CounterService
:
public class CounterService
{
private int count = 0;
public int Increment()
{
return ++count;
}
}
Теперь мы будем ASP.NET Core Зарегистрируйте этот сервис и протестируйте Transient
и Scoped
Поведение шаблона жизненного цикла.
Startup.cs
// Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<CounterService>();
// Другие конфигурации...
}
HomeController.cs
// HomeController.cs
public class HomeController : Controller
{
private readonly CounterService transientCounter;
public HomeController(CounterService transientCounter)
{
this.transientCounter = transientCounter;
}
public IActionResult Index()
{
ViewBag.TransientCount1 = transientCounter.Increment();
ViewBag.TransientCount2 = transientCounter.Increment();
return View();
}
}
существуют В приведенном выше коде,CounterService
зарегистрирован как Transient
жизненный цикл. каждый раз CounterService
Каждый запрос создает новый экземпляр. Когда мы дважды звоним по одному и тому же запросу Increment
метод,count
Переменные каждый раз инициализируются заново.
Startup.cs
// Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<CounterService>();
// Другие конфигурации...
}
HomeController.cs
// HomeController.cs
public class HomeController : Controller
{
private readonly CounterService scopedCounter1;
private readonly CounterService scopedCounter2;
public HomeController(CounterService scopedCounter1, CounterService scopedCounter2)
{
this.scopedCounter1 = scopedCounter1;
this.scopedCounter2 = scopedCounter2;
}
public IActionResult Index()
{
ViewBag.ScopedCount1 = scopedCounter1.Increment();
ViewBag.ScopedCount2 = scopedCounter2.Increment();
return View();
}
}
В приведенном выше коде CounterService зарегистрирован как Scoped жизненный цикл. В этом же запросе CounterService Экземпляры являются общими. Когда мы дважды звоним по одному и тому же запросу Increment метод, считать Переменные сохраняют свое состояние на протяжении всего запроса.
В общем, жизненный цикл Transient каждый раз создает новый экземпляр, который подходит для сервисов, которым не требуется сохранять состояние. Жизненный цикл Scoped совместно использует экземпляр во время одного запроса, что подходит для служб, которым необходимо сохранять состояние во время запроса.