3

Ich bin auf der Suche nach einem Kafka-Produzent als Singleton in meiner App zu injizieren. Derzeit sind zwei Schritte erforderlich, um die Instanz zu entfernen. Zuerst müssen Sie den Puffer leeren, zweiter Anruf entsorgen. Um die Leistung zu erhöhen, sollte dies nur passieren, wenn Nachrichten nicht mehr verarbeitet werden.asp.net Kernabhängigkeit Injektion Konfigurieren

Meine Lösung für ASP.NET-Kern ist, die AddSingleton() Methode in DI zu verwenden und dann ApplicationLifetime.ApplicationStopping.Register zu verwenden, um einen Rückruf zu registrieren, der den Erzeuger spült und abstellt. Ich folgte das gefunden Tutorial hier: https://andrewlock.net/four-ways-to-dispose-idisposables-in-asp-net-core/

zusammen einen schnellen Test Putting ich folgend in meiner Startup-Klasse tat

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>()); 
} 

aber wenn es läuft ich die folgende Fehlermeldung erhalten:

An exception of type 'System.InvalidOperationException' occurred in Microsoft.Extensions.DependencyInjection.Abstractions.dll but was not handled in user code: 'No service for type 'Confluent.Kafka.Producer' has been registered.'

Antwort

1

Die Annahme ist auch, dass Producer<T1,T2> von Producer

abgeleitet ist Sie nicht explizit eineregistriert habenmit der Service-Sammlung, so dass der Anbieter nicht weiß, wie er zu lösen ist.

services.AddSingleton<Producer>(
    c => new Producer<Null, string>(producerConfig, null, 
     new StringSerializer(Encoding.UTF8))); 
Verwandte Themen