.net 在同一IHostedService上调用了两次StartAsync

mspsb9vt  于 2022-11-26  发布在  .NET
关注(0)|答案(1)|浏览(137)

正如标题所述,当我注册IHostedService的多个示例时,它在第一个示例上调用StartAsync两次,但在第二个示例上没有,但它确实调用了两个构造函数。

程序.cs

services.AddSingleton<IHostedService, ProductService>(provider => (ProductService)provider.GetService<IProductService>()!);
services.AddSingleton<IProductService, ProductService>();
services.AddSingleton<IHostedService, ProductService>(provider => (ProductService)provider.GetService<IProductService>()!);
services.AddSingleton<IProductService, ProductService>();

产品服务.cs

public class ProductService : IProductService, IHostedService
{
    public async Task StartAsync(CancellationToken cancellationToken) { }
    public async Task StopAsync(CancellationToken cancellationToken) { }
}

我需要ProductService的多个示例(为简单起见,更改了名称)。

d5vmydt9

d5vmydt91#

您可以使用工厂来维护n个示例。

class ProductFactory : IProductFactory
{
    private readonly Dictionary<string, ProductService> _productService ;

    public void Register(string name, ProductService productService)
    {
        _productService[name] = productService;
    }

    public HttpClient Resolve(string name)
    {
        return _productService[name];
    }
}

var factory = new ProductFactory();
factory.Register("p1", new ProductService());
factory.Register("p2", new ProductService());
services.AddSingleton<IProductFactory>(factory);

public ProductController(IProductFactory factory)
{
    _productFactory = factory.Resolve("p1");
}

可以使用工厂不启动。

相关问题