Как написать простой актер - PullRequest
       62

Как написать простой актер

0 голосов
/ 29 августа 2018

Я хотел бы написать класс, который работает как актер - поэтому вместо предоставления его методов у него есть один обработчик команд, который ставит в очередь и располагает команду для соответствующего метода. Но я понятия не имею, как заставить этот код компилироваться - возможно, подход должен быть другим, но я бы хотел, чтобы интерфейс выглядел как ICommandHandler. С моей реализацией я не могу добавить методы к dictionary из-за другой подписи.

internal class Program
{
    private static void Main(string[] args)
    {
        new CommandHandler().InvokeCommand(new TurnOnCommand());
    }
}

public class CommandHandler : ICommandHandler
{
    private readonly Dictionary<Type, Func<Command, Task>> _handlers = new Dictionary<Type, Func<Command, Task>>();

    public CommandHandler()
    {
        // This will not compile - in final version this should be filled by reflection
        _handlers.Add(typeof(TurnOnCommand), HandleTurnOn);
        _handlers.Add(typeof(TurnOnCommand), TurnOffCommand);
    }

    public Task InvokeCommand(Command command)
    {
        // this will go to queue and than invoked
        _handlers[command.GetType()].Invoke(command);

        return Task.CompletedTask;
    }

    private Task HandleTurnOn(TurnOnCommand command)
    {
        return Task.CompletedTask;
    }

    private Task HandleTurnOff(TurnOffCommand command)
    {
        return Task.CompletedTask;
    }
}

public class Command
{
}

public class TurnOnCommand : Command
{
}

public class TurnOffCommand : Command
{
}

public interface ICommandHandler
{
    Task InvokeCommand(Command command);
}
...