Quiero encontrar una forma más elegante y apreciada de inyectar procesadores en CommandProcessorDispatcher
clase. O puede ser otra solución (el objetivo es separar cada lógica de procesamiento de comandos a una clase independiente). Tal vez algún patrón de diseño puede ser útil aquí.
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
se define con esas tecnologías y se usa ampliamente, por lo que es difícil separar eso de mi mente. ¿Cuál es el objetivo final? Quizás el concepto subyacente podría usar algún refinamiento.Respuestas:
Creo que puede simplificar un poco las cosas, sin demasiada repetitiva, mientras disfruta de algún tipo de seguridad.
Un ejemplo artificial:
Esto supone menos suposiciones sobre cómo se almacenan los procesadores de comandos, y no requiere delegados de acción, lo que no pude ver el propósito en su ejemplo; finalmente, creo que es preferible tener el downcast (desde ICommand a una de sus implementaciones ) se producen solo en una ubicación.
fuente