我是第一次使用命令模式。我有点不确定应该如何处理依赖关系。
在下面的代码中,我们发送一个CreateProductCommand
然后排队等待稍后执行。该命令封装了它执行所需的所有信息。
在这种情况下,我们可能需要访问某种类型的数据存储来创建产品。我的问题是,如何将此依赖项注入到命令中以便它可以执行?
public interface ICommand {
void Execute();
}
public class CreateProductCommand : ICommand {
private string productName;
public CreateProductCommand(string productName) {
this.ProductName = productName;
}
public void Execute() {
// save product
}
}
public class Dispatcher {
public void Dispatch<TCommand>(TCommand command) where TCommand : ICommand {
// save command to queue
}
}
public class CommandInvoker {
public void Run() {
// get queue
while (true) {
var command = queue.Dequeue<ICommand>();
command.Execute();
Thread.Sleep(10000);
}
}
}
public class Client {
public void CreateProduct(string productName) {
var command = new CreateProductCommand(productName);
var dispatcher = new Dispatcher();
dispatcher.Dispatch(command);
}
}
非常感谢
Ben
查看您的代码后,我建议不要使用命令模式,而是使用命令数据对象和命令处理程序:
public interface ICommand { }
public interface ICommandHandler<TCommand> where TCommand : ICommand {
void Handle(TCommand command);
}
public class CreateProductCommand : ICommand { }
public class CreateProductCommandHandler : ICommandHandler<CreateProductCommand> {
public void Handle(CreateProductCommand command) {
}
}
此方案更适合 CreateProductCommand 可能需要跨越应用程序边界的情况。此外,您还可以通过 DI 容器解析 CreateProductCommand 的实例,并配置所有依赖项。调度程序或“消息总线”在收到命令时将调用处理程序。
看一看here http://msdn.microsoft.com/en-us/library/ee658117.aspx#MessageBusStyle一些背景信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)