使用命令模式时的依赖注入

2024-01-15

我是第一次使用命令模式。我有点不确定应该如何处理依赖关系。

在下面的代码中,我们发送一个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(使用前将#替换为@)

使用命令模式时的依赖注入 的相关文章

  • 如何使用反应式扩展同时读取交错文件

    我是反应式扩展的新手 我想使用它 在 c 中 来读取包含多个交错流的文件 基本上文件的格式是ABCDABCDABCD 我更喜欢按顺序读取文件并分离流 即AAA BBB 等 并并行处理每个流 为每个流使用单独的线程 必须有某种形式的缓冲来确保
  • 如何针对 32 位和 64 位安全地从 GetTokenInformation() 调用可变长度结构数组? C#

    我正在关注提供的 pinvoke 代码here https stackoverflow com questions 2146153 how to get the logon sid in c 2146418 2146418但我有点害怕将可变
  • 将浮点型转换为双精度型

    我正在尝试转换Single to Double同时保持原来的价值 我找到了以下方法 Single f 5 2F Double d1 f 5 19999980926514 Double d2 Double Parse f ToString 5
  • 正则表达式:如何获取组名称

    我有一个 NET 正则表达式 它看起来类似于
  • 用户模式 ​​.NET 设置存储在哪里?

    我想知道 NET 中 settings 文件背后的魔力是什么 假设您创建了一个在此示例中称为的程序集SettingsHolder 您创建一个公共的设置类 其中在用户模式下有一个字符串 然后进行编译 现在 您在 MyApp 中引用您的程序集
  • 如何获取 ASP.NET MVC 中当前的虚拟路径?

    如何从 ASP NET MVC 视图中获取当前路径 URL 如果没有办法将其获取到视图中 那么如何将其获取到控制器中以便将其传递到视图呢 EDIT 我不需要 url 的协议和主机部分 这将为您返回视图中的 url
  • JetBrains Rider 针对 4.5 框架,无法切换到 4.7

    基本上 当尝试添加不支持旧框架的 NuGet 包时 会出现错误 但是在项目配置中只有 4 5 可用 在项目创建过程中 不存在选择目标的选项 有什么方法可以正确配置它吗 I haven t found out how to set up NE
  • C#生成的csv文件通过电子邮件发送嵌入到Lotus Note中电子邮件的底部

    我遇到了一个奇怪的问题 即使用 NET SmtpClient 通过电子邮件发送的 CSV 附件出现在电子邮件底部 而不是 Lotus Note 中的附件 我只是不知道如何解决这个问题 而且我无法访问客户端计算机 这使得调试非常困难 我可以采
  • 有没有办法在 C# 中仅通过文件名查找文件?

    我们现在使用绝对路径或相对路径在 C 应用程序中查找文件 如果文件位于当前工作目录下或 路径 之一下 有没有办法仅通过名称查找文件 使用绝对路径不好 使用相对路径也不够好 因为我们可能通过重命名或移动项目文件夹来更改项目结构 如果我们的代码
  • ASP.NET 3.5 更新至 4.0 -> Sys.WebForms.PageRequestManager 未定义

    正如标题所示 我最近将包含 UpdatePanels 和类似 AJAX 技术的 ASP NET 3 5 应用程序更新为 ASP NET 4 0 不幸的是 UpdatePanel 不再起作用 整页回发使一切都变得糟糕 Web config 文
  • 将固定文档/XPS 打印为 PDF,而不显示文件保存对话框

    我有一个FixedDocument我允许用户在 WPF GUI 中预览 然后打印到纸张上 而不显示任何 Windows 打印对话框 如下所示 private void Print PrintQueueCollection printQueu
  • WPF DataGrid 排序后滚动到顶部

    我有一个使用数据网格的 Net 4 0 WPF 应用程序 目前 按列排序后 网格的滚动位置保持在排序前的位置 对于此应用程序 我需要在任何排序后滚动到网格顶部 我尝试过像这样处理排序事件 Private Sub myDataGrid Sor
  • .NET 中的错误和异常有什么区别?

    您能向我解释一下错误和异常之间的区别吗 一个例外是利用语言语义的类 正如其他人所说 异常会中断堆栈的执行 直到被捕获 一个例外can用于传达错误 但更一般地用于传达发生了异常情况 另一方面 错误可能是异常的 也可能不是异常的 错误有以下几种
  • 实体框架中的 DbSet [重复]

    这个问题在这里已经有答案了 我在实体框架中有以下代码 using var dbc new TestDbContext var data from a in dbc tableList select new a id ToList 当我调试代
  • 正则表达式获取模式的最后一次出现

    我有一个字符串 我需要选择最后一次出现的模式 该字符串是 1302638400000 0 0 1302724800000 0 610 64999999999998 1302811200000 0 2266 6500000000001 130
  • Environment.CurrentDirectory 与 System.IO.Directory.GetCurrentDirectory

    我正在编写一个 Net WinForms 并不断在调试和发布配置之间切换 并且有一些文件我需要任一配置才能访问 我想做的是将文件放在 BIN 文件夹中的公共目录中 这样它看起来像这样 MyProject Bin CommonFiles My
  • Task.Run 作为反模式?

    我正在将 SQLite NET PCL 库用于我的 WinRT 项目SQliteAsyncConnection类 它提供经典的异步版本SQLiteConnection方法 然而 就该项目而言Github页面 https github com
  • SecurityAction.RequestMinimum 在 .Net 4.0 中已过时

    最近 我们的 Net 客户端库正在升级以针对 Net 4 0 进行编译 将目标框架更改为4 0后 应用程序出现一些编译错误 In AssemblyInfo cs assembly SecurityPermission SecurityAct
  • 为什么 0.5 mod 0.1 在不同的编程语言中结果不同?

    我有一个关于模数的问题 模运算求一个数除以另一个数的余数 我原本期望 0 5 0 1 0 的结果 但是当我在 PHP 或 net 中运行它时 我得到 0 1 我运行的 php 代码是 var dump fmod 0 5 0 1 在 net中
  • 从共享网络文件夹运行的 .NET 应用程序的性能损失

    从共享网络文件夹运行 NET 4 0 应用程序是否有任何性能损失 我发现哪个应用程序启动速度较慢 但 在使用时没有注意到任何变慢 但不确定 当通过网络运行可执行文件时 Windows 不会在应用程序启动时通过网络传输整个应用程序 这样做是为

随机推荐

  • iOS 检查 WiFi 辅助是否已启用

    我正在尝试检查 WiFi 辅助是否已启用 当我连接到接入点获取一些数据时遇到问题 当我的连接状况不佳时 我的蜂窝数据会被使用并干扰我的接入点 有什么方法可以检查该选项是否启用 好吧 我想我能帮上一点忙 你需要check SCNetworkR
  • 路由到 Laravel 5 子文件夹中的控制器

    这是我的routes php Route get Panel PanelController index 这是我的文件夹 Http Controllers Panel PanelController php 这是我的控制器 namespac
  • 如何使用 Google Assist API 实现 Google Assistant

    我一直在查看并阅读有关 Google Now on Tap 的内容 来自http developer android com training articles assistant html http developer android c
  • 如何从元数据查找 OData 版本

    我可以访问 OData 服务 现在我需要找到该服务的 OData 版本 metadata 中有版本属性 但我不知道该选哪一个 我需要从
  • 如何保留 HTML
     标记中包含的文本的空白缩进,不包括文档中 
     标记的当前缩进级别?                
                

    我正在尝试在网站上显示我的代码 但在正确保留空格缩进方面遇到问题 例如给出以下代码片段 Here is my code pre def some funtion return Hello World end pre 这在浏览器中显示为 He
  • 如何在pyspark中将数据分成组

    我需要在时间序列数据中找到组 数据样本 我需要输出列group基于value and day 我尝试过使用 lag lead 和 row number 但最终一无所获 似乎每次值发生变化时您都想增加该组 如果是这样 这就是一种缺口和岛屿问题
  • 如何修复类型“Future”不是“String”类型的子类型 Flutter

    颤振初学者在这里 我收到此错误 type Future
  • Python 中的函数重载:缺失 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions As 函数重载 http web a
  • 平移/旋转后重置 CSS 变换原点

    在 CSS 中翻译元素后 其变换原点仍保留在其原始位置 在这种特殊情况下 我希望变换原点为stay在所有变换期间相对于元素居中 我希望起源是这样的follow被变换的元素 我知道关于transform origin属性 但这似乎需要我每次手
  • 为什么我在设置 LibGDX 时没有通用补间引擎

    接下来是关于设置 LibGDX 项目的教程 教程说在第三方部分应该有一个通用 Tween 引擎 地雷不显示 有什么办法可以显示吗 我需要下载什么 提前致谢 Gdx setup new ui jar 不附带 TweenEngine 库 还有另
  • z-index 不适用于绝对位置

    如果你看看我的测试网站here http www hosting mate com marinebuoysaustralia 您将看到 向下滚动 按钮与我的所有内容重叠 无论我输入什么 z index 有办法解决这个问题吗 我意识到我的立场
  • 在 VBscript 中使用命令行参数

    如何在 VBscript 中传递和访问命令行参数 Set args Wscript Arguments For Each arg In args Wscript Echo arg Next 从命令提示符运行脚本 如下所示 CSCRIPT M
  • 如何将 Spring Boot 与 MySQL 数据库和 JPA 结合使用?

    我想使用 MySQL 和 JPA 设置 Spring Boot 为此我创建 Person package domain import javax persistence Entity Table name person public cla
  • 什么是生成单元测试框架?

    在 stackoverflow 上我遇到了 mbunit 在其页面上 它指出 mbunit 是一个生成单元测试框架 但我找不到任何描述生成单元测试框架是什么的地方 我希望得到 一个定义 有关生成单元测试框架是什么和不是什么的文章的链接 生成
  • 如何在 C 程序(在 Linux 上)中接收使用 sigqueue 发送的信号?

    如何在 C 程序 在 Linux 上 中接收使用 sigqueue 发送的信号 如果只是使用kill来发送信号 我只需添加一个带有类似这样的接收器 signal SIGUSR1 sigusr1 指向一个像这样的简单函数 void sigus
  • 更新到 Hibernate 5 后无法访问 TransactionManager 或 UserTransaction

    我刚刚从 Hibernate 4 2 19 更新到 Hibernate 5 1 2 当然 这并不是说事情没有按计划进行 在解决了几个问题 其中 JOIN FETCH 必须替换为 JOIN 之后 我现在遇到了下一个问题 org springf
  • 在 Linux 上用 C 语言使用 RAW Socket 发送组播

    我编写了一个在 Ubuntu LTE 上运行的程序 该程序应该使用原始套接字将多播消息发送到 239 255 25 25 端口 5004 为了接收多播 我使用 UDP 套接字 通过套接字发送的数据是使用wireshark从rtp流中捕获的
  • 方案尾递归

    我正在尝试创建一个方案尾递归函数 flatten tl rec 来展平嵌套列表列表 define flatten tl rec lambda xs letrec flatten tl rec acc lambda xs acc cond e
  • Codeigniter REST API 提供未知方法?

    我在用着https github com chriskacerguis codeigniter restserver https github com chriskacerguis codeigniter restserver与代码点火器
  • 使用命令模式时的依赖注入

    我是第一次使用命令模式 我有点不确定应该如何处理依赖关系 在下面的代码中 我们发送一个CreateProductCommand然后排队等待稍后执行 该命令封装了它执行所需的所有信息 在这种情况下 我们可能需要访问某种类型的数据存储来创建产品