3

Je cherche à injecter un producteur de kafka comme singleton dans mon application. Il a actuellement deux étapes requises pour disposer de l'instance. D'abord, vous devez vider le tampon, le second appel dispose. Pour améliorer les performances, cela ne devrait se produire que lorsque les messages ne sont plus traités.asp.net core injection de dépendance Configurer

Ma solution pour le noyau ASP.NET, est d'utiliser la méthode AddSingleton() dans DI, puis d'utiliser ApplicationLifetime.ApplicationStopping.Register pour enregistrer un rappel qui videra et éliminera le producteur. J'ai suivi le tutoriel trouvé ici: https://andrewlock.net/four-ways-to-dispose-idisposables-in-asp-net-core/

mettre en place un test rapide je l'ai fait ce qui suit dans ma classe de démarrage:

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

mais quand il fonctionne, je reçois l'erreur suivante:

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.'

Répondre

1

L'hypothèse est également que Producer<T1,T2> est dérivé de Producer

vous n'avez pas explicitement enregistrer un Producer avec la collection de service afin que le fournisseur ne sache pas comment le résoudre.

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