Я хотел бы написать класс, который работает как актер - поэтому вместо предоставления его методов у него есть один обработчик команд, который ставит в очередь и располагает команду для соответствующего метода. Но я понятия не имею, как заставить этот код компилироваться - возможно, подход должен быть другим, но я бы хотел, чтобы интерфейс выглядел как 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);
}