Tôi muốn tìm cách thanh lịch hơn và đánh giá cao để tiêm bộ xử lý vào CommandProcessorDispatcher
lớp. Hoặc nó có thể là một giải pháp khác (mục tiêu là tách riêng từng logic xử lý lệnh thành lớp độc lập). Có lẽ một số mẫu thiết kế có thể hữu ích ở đây.
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);
}
}
Bạn đã cho MediatR chưa? Về cơ bản nó làm những gì bạn cần, và một số thứ nữa.
—
Philippe
Điều này thực sự cũ, vì vậy bất kỳ câu hỏi làm rõ nào có thể sẽ không được trả lời. Giống như, điều này có liên quan gì đến WPF hay UAP không?
—
Berin Loritsch
ICommand
được định nghĩa với những công nghệ đó và được sử dụng rộng rãi, vì vậy thật khó để ly dị điều đó khỏi tâm trí tôi. Mục tiêu cuối cùng là gì? Có lẽ khái niệm cơ bản có thể sử dụng một số tinh chỉnh.