ASP.NET Core 依赖注入配置

4
我希望在我的应用程序中以单例模式注入一个Kafka生产者。目前需要两个步骤来处理实例的释放。首先,您必须刷新缓冲区,其次调用dispose方法。为了提高性能,这应该仅在不再处理消息时发生。
对于ASP.NET Core,我的解决方案是使用DI中的“AddSingleton()”方法,然后使用“ApplicationLifetime.ApplicationStopping.Register”注册回调函数来刷新和释放生产者。我按照此处找到的教程进行操作:https://andrewlock.net/four-ways-to-dispose-idisposables-in-asp-net-core/ 在我的启动类中,我快速测试了以下内容:
public void ConfigureServices(IServiceCollection services)
{         
    var producerConfig = new Dictionary<string, object>
    {
        { "bootstrap.servers", "192.168.99.100:9092" },
        { "client.id", Dns.GetHostName() },
                    { "api.version.request", true }
    };
    services.AddSingleton(new Producer<Null, string>(producerConfig, null, new StringSerializer(Encoding.UTF8)));
   services.AddMvc();
}


public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IApplicationLifetime lifetime)
{
    loggerFactory.AddConsole();
    app.UseMvc();
    app.UseWebSockets();            
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();

    }
    lifetime.ApplicationStopping.Register(flushAndDispose, app.ApplicationServices.GetRequiredService<Producer>());
}

但是当它运行时,我收到以下错误:

在 Microsoft.Extensions.DependencyInjection.Abstractions.dll 中发生了类型为 'System.InvalidOperationException' 的异常,但未被用户代码处理:'没有为类型 'Confluent.Kafka.Producer' 注册服务'

1个回答

6
假设 Producer<T1,T2> 是从 Producer 派生的。
由于您没有在服务集合中显式注册 Producer,因此提供程序不知道如何解决它。
services.AddSingleton<Producer>(
    c => new Producer<Null, string>(producerConfig, null, 
        new StringSerializer(Encoding.UTF8)));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接