【问题标题】:StartAsync is called twice on the same IHostedServiceStartAsync 在同一个 IHostedService 上被调用两次
【发布时间】:2022-11-22 16:11:19
【问题描述】:

如标题所述,当我注册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 的多个实例(为简单起见更改了名称)。

【问题讨论】:

    标签: c# .net dependency-injection


    【解决方案1】:

    您可以使用工厂来维护 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");
    }
    

    你使用工厂不启动。

    【讨论】:

      猜你喜欢
      • 2015-04-13
      • 1970-01-01
      • 1970-01-01
      • 2022-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多