Einfache Verwendung des Injectors für den generischen Command Handler

Die Schnittstellen, Befehle und der Befehlshandler werden gemäß den Anweisungen im Simpleinjector-Wiki eingerichtet.

public interface ICommand
{
    string Name { get; set; }
}

public class Command1 : ICommand
{
    public string Name { get; set; }
}

public class Command2 : ICommand
{
    public string Name { get; set; }
}

public interface ICommandHandler<TCommand>
{
    void Execute(TCommand Command);
}

public class Command1Handler : ICommandHandler<Command1>
{
    public void Execute(Command1 Command) {
        Console.WriteLine(Command.Name);
    }
}

public class Command2Handler : ICommandHandler<Command2>
{
    public void Execute(Command2 Command) {
        Console.WriteLine(Command.Name + "Hello");
    }
}

Dekorateur:

public class CommandDecorator<TCommand> : ICommandHandler<TCommand>
{
    private readonly ICommandHandler<TCommand> _handler;

    public CommandDecorator(ICommandHandler<TCommand> handler)
    {
        this._handler = handler;
    }

    public void Execute(TCommand command)
    {
        this._handler.Execute(command);
    }
}

Beispielprogramm

public class Program
{
    static void Main(string[] args)
    {
        Container container = new Container();

        //registering 
        container.RegisterAll<ICommand>(typeof(Command1), typeof(Command2));

        container.RegisterManyForOpenGeneric(
            typeof(ICommandHandler<>),
            typeof(ICommandHandler<>).Assembly);

        container.RegisterDecorator(typeof(ICommandHandler<>), 
            typeof(CommandDecorator<>));

        container.Verify();

        // sample test command 
        ICommand testcommand = new Command2();
        testcommand.Name = "command 1";

        var type = typeof(ICommandHandler<>).MakeGenericType(testcommand.GetType());

        dynamic instance = container.GetInstance(type);
        instance.Execute((dynamic)testcommand);
    }
}

Ist dies der richtige Weg, um den richtigen Handler für die Verarbeitung des Befehls zur Laufzeit zu finden? Dies ist ein Beispiel und in der realen App werden die Befehle in eine Warteschlange gestellt und ein Dienst wird den Befehl lesen und verarbeiten. Ich denke, der Decorator muss dafür verwendet werden, kann es aber nicht zum Laufen bringen. Bitte schlagen Sie gegebenenfalls bessere Optionen vor.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage