Обновлять
Где-то между .Net Core 2.2 и 3.1 поведение изменилось, AddHostedService теперь добавляет Singleton вместо предыдущей службы Transient. Кредит - LeonG
public static class ServiceCollectionHostedServiceExtensions
{
/// <summary>
/// Add an <see cref="IHostedService"/> registration for the given type.
/// </summary>
/// <typeparam name="THostedService">An <see cref="IHostedService"/> to register.</typeparam>
/// <param name="services">The <see cref="IServiceCollection"/> to register with.</param>
/// <returns>The original <see cref="IServiceCollection"/>.</returns>
public static IServiceCollection AddHostedService<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] THostedService>(this IServiceCollection services)
where THostedService : class, IHostedService
{
services.TryAddEnumerable(ServiceDescriptor.Singleton<IHostedService, THostedService>());
return services;
}
/// <summary>
/// Add an <see cref="IHostedService"/> registration for the given type.
/// </summary>
/// <typeparam name="THostedService">An <see cref="IHostedService"/> to register.</typeparam>
/// <param name="services">The <see cref="IServiceCollection"/> to register with.</param>
/// <param name="implementationFactory">A factory to create new instances of the service implementation.</param>
/// <returns>The original <see cref="IServiceCollection"/>.</returns>
public static IServiceCollection AddHostedService<THostedService>(this IServiceCollection services, Func<IServiceProvider, THostedService> implementationFactory)
where THostedService : class, IHostedService
{
services.TryAddEnumerable(ServiceDescriptor.Singleton<IHostedService>(implementationFactory));
return services;
}
}
Ссылка ServiceCollectionHostedServiceExtensions
Оригинальный ответ
Они похожи, но не полностью
AddHostedService
является частью Microsoft.Extensions.Hosting.Abstractions
.
Он принадлежит Microsoft.Extensions.Hosting.Abstractions
в _5 _ а> класс
using Microsoft.Extensions.Hosting;
namespace Microsoft.Extensions.DependencyInjection
{
public static class ServiceCollectionHostedServiceExtensions
{
/// <summary>
/// Add an <see cref="IHostedService"/> registration for the given type.
/// </summary>
/// <typeparam name="THostedService">An <see cref="IHostedService"/> to register.</typeparam>
/// <param name="services">The <see cref="IServiceCollection"/> to register with.</param>
/// <returns>The original <see cref="IServiceCollection"/>.</returns>
public static IServiceCollection AddHostedService<THostedService>(this IServiceCollection services)
where THostedService : class, IHostedService
=> services.AddTransient<IHostedService, THostedService>();
}
}
Обратите внимание, что используется Transient
срок службы, а не Singleton
Внутри фреймворк добавляет все размещенные службы в другую службу (HostedServiceExecutor
)
public HostedServiceExecutor(ILogger<HostedServiceExecutor> logger,
IEnumerable<IHostedService> services) //<<-- note services collection
{
_logger = logger;
_services = services;
}
при запуске это синглтон через Конструктор WebHost.
_applicationServiceCollection.AddSingleton<HostedServiceExecutor>();
person
Nkosi
schedule
23.07.2018
Are they equal
секунды, которые вызывают первый изнутри, но как временный, а не синглтон - person Nkosi   schedule 23.07.2018StartAsync
,StopAsync
методов. Использование ограниченных / переходных объектов возможно с помощью областей видимости - person Panagiotis Kanavos   schedule 23.07.2018