Wie registriere ich einen Funktionsdelegaten mit einer Schnittstelle, die einen generischen Typ hat?C#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Wie registriere ich einen Funktionsdelegaten mit einer Schnittstelle, die einen generischen Typ hat?

Post by Anonymous »

Es tut mir leid, wenn die Frage wie ein Programmieranfänger formuliert ist (das liegt daran, dass ich immer noch ein Anfänger bin). Ich wollte einen flexiblen MessageProcessor erstellen, abhängig vom SupplierType(= enum) und je nachdem welcher MessageProcessor herauskommt, wird ein anderes Message-Objekt verwendet.
Die aktuelle Situation sieht so aus:

Code: Select all

public interface IMessageProcessor
{
Task ProcessMessageAsync(TMessage message, string tableConfig);
}

public class MessageProcessorA : IMessageProcessor
{
public Task ProcessMessageAsync(MessageA message, string tableConfig)
}

public class MessageProcessorB : IMessageProcessor
{
public Task ProcessMessageAsync(MessageB message, string tableConfig)
}
Dann könnte ich in der Program.cs so etwas tun:

Code: Select all

builder.Services
// Register all message processors
.AddSingleton(serviceProvider => supplierType =>
{
return supplierType switch
{
SupplierType.A => serviceProvider.GetRequiredService(),
SupplierType.B => serviceProvider.GetRequiredService(),
_ => throw new NotImplementedException(),
};
})
Weil dies offenbar eine Möglichkeit ist, zwischen verschiedenen Diensten zu wechseln, ohne dass ein Umschaltfall im Logikcode mit einer IFactory und allem, was dazugehört, erforderlich ist. Was muss ich im IMessageProcessor ausfüllen, damit es ein Ganzes ergibt? Das könnte ein schlechtes Design sein, oder vielleicht gibt es eine einfache Lösung, aber es ist ein erstes Mal.
Die Idee war, dass ich das einfach tun müsste und es würde automatisch alles auflösen:

Code: Select all

// DI resolves factory
private readonly Func _processorFactory;

// In a method:
await _processorFactory(supplierType).ProcessMessageAsync(message, tableData.Config).ConfigureAwait(false);
BEARBEITEN: Ich habe das DataFlow-Block-Konzept noch nie gemacht, ich werde versuchen, es zu implementieren und sehen, ob ich es herausfinden kann. Sieht interessant aus.
EDIT1: Ich denke, ich muss eine Kombination aus Wörterbuch und Blöcken verwenden, denn wenn ich 10 verschiedene MessageProcessors habe, wird es Spaghetti geben
EDIT2: Nvm, Dataflow-Aktionsblöcke könnten übertrieben sein, wenn nur 1 Nachricht pro Anwendungslauf verarbeitet wird

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post