.net 使用命令模式时的依赖项注入
我第一次使用命令模式。我有点不确定应该如何处理依赖关系 在下面的代码中,我们调度一个.net 使用命令模式时的依赖项注入,.net,dependency-injection,command-pattern,.net,Dependency Injection,Command Pattern,我第一次使用命令模式。我有点不确定应该如何处理依赖关系 在下面的代码中,我们调度一个CreateProductCommand,然后排队等待稍后执行。该命令封装了它需要执行的所有信息 在这种情况下,我们可能需要访问某种类型的数据存储来创建产品。我的问题是,如何将此依赖项注入到命令中,以便它可以执行 public interface ICommand { void Execute(); } public class CreateProductCommand : ICommand {
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);
}
}
公共接口ICommand{
void Execute();
}
公共类CreateProductCommand:ICommand{
私有字符串产品名称;
公共CreateProductCommand(字符串产品名){
this.ProductName=ProductName;
}
public void Execute(){
//保存产品
}
}
公共类调度器{
公共无效调度(TCommand命令),其中TCommand:ICommand{
//将命令保存到队列
}
}
公共类命令调用程序{
公开募捐{
//获取队列
while(true){
var命令=queue.Dequeue();
command.Execute();
睡眠(10000);
}
}
}
公共类客户端{
public void CreateProduct(字符串产品名){
var命令=新建CreateProductCommand(productName);
var dispatcher=newdispatcher();
调度员。调度(命令);
}
}
非常感谢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) {
}
}
公共接口ICommand{}
公共接口ICommandHandler,其中TCommand:ICommand{
无效句柄(TCommand命令);
}
公共类CreateProductCommand:ICommand{}
公共类CreateProductCommandHandler:ICommandHandler{
公共无效句柄(CreateProductCommand){
}
}
此场景更适合CreateProductCommand可能需要跨越应用程序边界的情况。此外,还可以使用配置了所有依赖项的DI容器解析CreateProductCommand实例。调度器或“消息总线”将在接收到命令时调用处理程序
查看一些背景信息。谢谢。twitter上的CQRS用户也向我指出了这一方向。即使没有CQRS,如上所述的设计也有很大的好处。这是一个例子。