Краткое введение, прямой официальный документ
Краткое введение, прямой официальный документ
public interface IOperation { Guid OperationId { get; } } public interface IOperationTransient : IOperation { } public interface IOperationScoped : IOperation { } public interface IOperationSingleton : IOperation { } public interface IOperationSingletonInstance : IOperation { }
public class Operation : IOperationTransient, IOperationScoped, IOperationSingleton, IOperationSingletonInstance { public Operation() : this(Guid.NewGuid()) { } public Operation(Guid id) { OperationId = id; } public Guid OperationId { get; private set; } }
public class OperationService { public OperationService( IOperationTransient transientOperation, IOperationScoped scopedOperation, IOperationSingleton singletonOperation, IOperationSingletonInstance instanceOperation) { TransientOperation = transientOperation; ScopedOperation = scopedOperation; SingletonOperation = singletonOperation; SingletonInstanceOperation = instanceOperation; } public IOperationTransient TransientOperation { get; } public IOperationScoped ScopedOperation { get; } public IOperationSingleton SingletonOperation { get; } public IOperationSingletonInstance SingletonInstanceOperation { get; } }
stay Startup.ConfigureServices , add each type to the container based on its specified lifetime: C# public void ConfigureServices(IServiceCollection services) { services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); services.AddScoped(); services.AddTransient (); services.AddScoped (); services.AddSingleton (); services.AddSingleton (new Operation(Guid.Empty)); // OperationService depends on each of the other Operation types. services.AddTransient (); }
public class IndexModel : PageModel { private readonly IMyDependency _myDependency; public IndexModel( IMyDependency myDependency, OperationService operationService, IOperationTransient transientOperation, IOperationScoped scopedOperation, IOperationSingleton singletonOperation, IOperationSingletonInstance singletonInstanceOperation) { _myDependency = myDependency; OperationService = operationService; TransientOperation = transientOperation; ScopedOperation = scopedOperation; SingletonOperation = singletonOperation; SingletonInstanceOperation = singletonInstanceOperation; } public OperationService OperationService { get; } public IOperationTransient TransientOperation { get; } public IOperationScoped ScopedOperation { get; } public IOperationSingleton SingletonOperation { get; } public IOperationSingletonInstance SingletonInstanceOperation { get; } public async Task OnGetAsync() { await _myDependency.WriteMessage( "IndexModel.OnGetAsync created this message."); } }
Следующие два выходных данных показывают результаты двух запросов:
Первый запрос:
Работа контроллера:
Временный: d233e165-f417-469b-a866-1cf1935d2518 Область применения: 5d997e2d-55f5-4a64-8388-51c4e3a1ad19 Единичный экземпляр: 01271bc1-9e31-48e7-8f7c-7261b040ded9 Пример: 00000000-0000-0000-0000-000000000000
Эксплуатация Обслуживание эксплуатация:
Временный: c6b049eb-1318-4e31-90f1-eb2dd849ff64 Область применения: 5d997e2d-55f5-4a64-8388-51c4e3a1ad19 Единичный экземпляр: 01271bc1-9e31-48e7-8f7c-7261b040ded9 Пример: 00000000-0000-0000-0000-000000000000
Второй запрос:
Работа контроллера:
Временный: b63bd538-0a37-4ff1-90ba-081c5138dda0 Область применения: 31e820c5-4834-4d22-83fc-a60118acb9f4 Единичный экземпляр: 01271bc1-9e31-48e7-8f7c-7261b040ded9 Пример: 00000000-0000-0000-0000-000000000000
Эксплуатация Обслуживание эксплуатация:
Временный: c4cbacb8-36a2-436d-81c8-8c1b78808aaf Область применения: 31e820c5-4834-4d22-83fc-a60118acb9f4 Единичный экземпляр: 01271bc1-9e31-48e7-8f7c-7261b040ded9 Пример: 00000000-0000-0000-0000-000000000000
Обратите внимание, какое значение OperationId будет изменяться внутри запроса и между различными запросами:
- Переходные объекты всегда разные. Значение идентификатора временной операции первого и второго клиентских запросов отличается для операции обслуживания операций и внутри клиентского запроса. Предоставляет новый экземпляр для каждого запроса на обслуживание и запроса клиента.
- Объекты области видимости одинаковы в одном клиентском запросе, но различаются в нескольких клиентских запросах.
- Объект с одним экземпляром является одним и тем же для каждого объекта и каждого запроса (независимо от того, предоставлен ли экземпляр операции при запуске или нет. Конфигурационные сервисы).
Далее следует ключевой момент этой статьи
public void ConfigureServices(IServiceCollection services) { services.AddSingleton(); services.AddTransient (); services.AddScoped (); }
public class SingletonService { public string Id = Guid.NewGuid().ToString(); } public class ScopedService { public string Id = Guid.NewGuid().ToString(); } public class TransientService { public string Id = Guid.NewGuid().ToString(); private ScopedService _transient; private SingletonService _singleton; public TransientService(ScopedService transient, SingletonService singleton) { _transient = transient; _singleton = singleton; } }
It's ok,transient Can rely on singleton and scoped
about Transient service,It can be relied on by any service,But the life cycle of a service created in a dependent service follows the dependent service
about Scoped service,It can only be Transient and Scoped Service dependency,Life cycle will not change,If you want to Singleton Used in services,have access to IServiceProvider Of CreateScope Method ,Then? GetService, But generated scoped The service life cycle is Singleton
about Singleton service,It can be relied on by any service,Life cycle will not change
public class SingletonService { public string Id = Guid.NewGuid().ToString(); private ScopedService _scoped; public SingletonService(IServiceProvider serviceProvider) { using (var scope = serviceProvider.CreateScope()) { _scoped = scope.ServiceProvider.GetService(); } } } public class ScopedService { public string Id = Guid.NewGuid().ToString(); } public class TransientService { public string Id = Guid.NewGuid().ToString(); }
При этом в одном примере используется служба с ограниченной областью действия
Оригинал: “https://programmer.help/blogs/the-dependency-between-services-of-netcore-dependency-injection.html”