Ich möchte einen eleganteren und wertvolleren Weg finden, um Prozessoren in den CommandProcessorDispatcher
Unterricht zu bringen. Oder es kann eine andere Lösung sein (das Ziel ist es, jede Befehlsverarbeitungslogik von einer unabhängigen Klasse zu trennen). Vielleicht kann hier ein Designmuster nützlich sein.
public interface ICommand { }
public class StartCommand : ICommand { }
public class StopCommand : ICommand { }
public interface ICommandProcessor<in T> where T : ICommand
{
void Process(T command);
}
public class StartCommandProcessor : ICommandProcessor<StartCommand>
{
public void Process(StartCommand command) { }
}
public class StopCommandProcessor : ICommandProcessor<StopCommand>
{
public void Process(StopCommand command) { }
}
public interface ICommandProcessorDispatcher
{
void Process(ICommand command);
}
public class CommandProcessorDispatcher : ICommandProcessorDispatcher
{
public CommandProcessorDispatcher(Dictionary<Type, Action<ICommand>> processors)
{
_processors = processors;
}
private readonly Dictionary<Type, Action<ICommand>> _processors;
public void Process(ICommand command)
{
_processors[command.GetType()](command);
}
}
internal class Program
{
private static void Main(string[] args)
{
var dict = new Dictionary<Type, Action<ICommand>>
{
{ typeof(StartCommand), x => new StartCommandProcessor().Process((StartCommand)x) },
{ typeof(StopCommand), x => new StopCommandProcessor().Process((StopCommand)x) },
};
var dispatcher= new CommandProcessorDispatcher(dict);
}
}
ICommand
wird mit diesen Technologien definiert und ausgiebig genutzt, daher ist es schwierig, dies von meinem Verstand zu trennen. Was ist das Endziel? Vielleicht könnte das zugrunde liegende Konzept etwas verfeinert werden.Antworten:
Ich glaube, Sie können die Dinge ein wenig vereinfachen, ohne zu viel Boilerplate, während Sie dennoch eine gewisse Sicherheit genießen .
Ein erfundenes Beispiel:
Dies macht weniger Annahmen darüber, wie die Befehlsprozessoren gespeichert werden, und erfordert keine Aktionsdelegierten, die ich in Ihrem Beispiel nicht gesehen habe. Schließlich halte ich es für vorzuziehen, den Downcast (von ICommand zu einer seiner Implementierungen) zu haben ) treten nur an einer Stelle auf.
quelle