架构问题:使用依赖注入导致垃圾 API

2024-02-08

我正在尝试创建一个类,它执行各种与数据库相关的低级操作,但为 UI 层提供了一个非常简单的界面。

此类表示全部位于特定聚合根内的一堆数据,由单个 ID int 检索。

构造函数有四个参数:

public AssetRegister(int caseNumber, ILawbaseAssetRepository lawbaseAssetRepository, IAssetChecklistKctcPartRepository assetChecklistKctcPartRepository, User user)
{
  _caseNumber = caseNumber;
  _lawbaseAssetRepository = lawbaseAssetRepository;
  _assetChecklistKctcPartRepository = assetChecklistKctcPartRepository;
  _user = user;
  LoadChecklists();
}

UI层通过接口访问该类IAssetRegister。 Castle Windsor 本身可以提供 ILawbaseAssetRepository 和 IAssetChecklistKctcPartRepository 参数,但 UI 代码需要使用匿名类型提供其他两个参数,如下所示:

int caseNumber = 1000;
User user = GetUserFromPage();
IAssetRegister assetRegister = Moose.Application.WindsorContainer.Resolve<IAssetRegister>(new { caseNumber, user});

从API设计的角度来看,这是垃圾。 UI 层开发人员无法知道 IAssetRegister 需要一个整数和一个 User。他们需要了解该类的实现才能使用它。

我知道我这里一定有某种设计问题。有人能给我一些指点吗?


尝试将消息与行为分开。创建一个保存操作数据的类,并创建一个包含该操作的业务逻辑的不同类。例如,创建以下命令:

public class RegisterAssetCommand
{
    [Required]
    public int CaseNumber { get; set; }

    [Required]
    public User Operator { get; set; }
}

现在定义一个处理业务命令的接口:

public interface ICommandHandler<TCommand>
{
    void Handle(TCommand command);
}

您的演示代码现在将如下所示:

var command = new RegisterAssetCommand
{
    CaseNumber = 1000,
    Operator = GetUserFromPage(),
};

var commandHandler = WindsorContainer
    .Resolve<ICommandHandler<RegisterAssetCommand>);

commandHandler.Handle(command);

Note: 如果可能的话,转移获得许可的责任commandHandler从表示类中取出并将其注入到该类的构造函数中(再次构造函数注入)。

不,您可以创建一个实现ICommandHandler<RegisterAssetCommand>像这样:

public class RegisterAssetCommandHandler
    : ICommandHandler<RegisterAssetCommand>
{
    private ILawbaseAssetRepository lawbaseAssetRepository;
    private IAssetChecklistKctcPartRepository assetRepository;

    public RegisterAssetCommandHandler(
        ILawbaseAssetRepository lawbaseAssetRepository,
        IAssetChecklistKctcPartRepository assetRepository)
    {
        this.lawbaseAssetRepository = lawbaseAssetRepository;
        this.assetRepository = assetRepository;
    }

    public void Handle(RegisterAssetCommand command)
    {
        // Optionally validate the command

        // Execute the command
    }
}

或者,您甚至可以离开User出于RegisterAssetCommand通过注入IUserProvider in the RegisterAssetCommandHandler. The IUserProvider接口可以有一个GetUserForCurrentContext处理程序可以调用。

我希望这是有道理的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

架构问题:使用依赖注入导致垃圾 API 的相关文章

  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • 如何让用户编辑网页内容并保存给所有浏览者? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在尝试创建一个以简单文本 Hello 开头的网站 然后 任何访问该网站的人都可以将内容更改为他们喜欢的内容 保存这些内容不仅是为了
  • 网络故障后重新连接ActiveMQ服务器

    我们正在使用 ActiveMQ 5 8 0 通过 TCP 将 Java 应用程序连接到另一个系统 请求 回复 与对临时队列的回复同步 与我们的客户端及其相应部分配合良好 但我们不确定如何处理 异常 情况 例如短暂的网络故障 我们正在测试应用
  • 如何将wtforms的FileField自定义为图像按钮?

    我正在尝试从项目文件夹加载图像以用作图标 而不是正常的 选择文件 这是我到目前为止所尝试过的 不仅图像未加载 旧按钮仅显示一半 HTML div form tweet image class submit image tweet div C
  • 根据 R 中的匹配条件组合行中的值

    我有一个关于 R 中聚合值的简单问题 假设我有一个数据框 DF lt data frame col1 c Type 1 Type 1B Type 2 col2 c 1 2 3 看起来像这样 col1 col2 1 Type 1 1 2 Ty
  • SendKeys.Send 和 Windows 键

    我正在尝试为我的 WinForm 应用程序创建一个键盘触发器 调用 Windows 键 数字键 快捷键 从而在任务栏上的第 n 个插槽中启动应用程序的新实例 例如 我想运行 Photoshop 它位于任务栏的第一个位置 WinKey 1 我
  • 如何使用 zipfileset src 属性而无需为所有 jar 手动指定它?

    我目前有这个
  • brew 安装失败:curl(77) 设置证书验证时出错

    好的 我正在运行带有自制软件的旧 Mac 10 6 8 brew doctor 报告没有错误 我已经尝试过brew prune update 等 每次我尝试安装软件包时 都会收到此错误 curl 77 error setting certi
  • Web Essentials LESS 编译器没有给出错误消息

    使用 Visual Studio 2012 Update 2 Web Essentials 2 7 假设LESS有错误 保存文件时 预览窗格中会显示一条消息 上面写着 Compile Error See error list for det
  • 为 ggplot2 中的每个方面设置不同的轴限制,不使用刻度=“自由”

    我想要的一般解决方案是能够独立地为每个面指定任意轴限制 通过将秤设置为自由来获得基本功能 例如 ggplot diamonds aes x carat y price geom point facet wrap clarity nrow 4
  • Application.kt:未解析的参考:firebasemessaging

    我正在尝试更新firebase messaging到新版本8 0 0 dev 10 但是 我收到这些错误 Running Gradle task assembleDebug Application kt 5 27 Unresolved re
  • 在 MySQL 和 CodeIgniter 中使用 Match 和 Against

    我正在尝试在我的 codeIgniter 项目中实现搜索功能 我有一个名为 Product search 的表 使用以下命令在其中设置全文索引 ALTER TABLE product search ADD FULLTEXT prod tit
  • React循环通过json对象并显示数据

    我有一个演示here https stackblitz com edit react ts read json file index tsx 我有一个正在导入的简单 json 文件 我想循环遍历并在 div 中输出 json 数据 我可能想
  • 在支持多租户的 Django 中正确加载 Keras 模型

    我尝试在 django 中编写一个 REST api 它使用 Keras 模型返回预测 但是 那load model 函数需要一些时间来加载模型 我不希望我的用户必须等待这么长时间 每次初始化模型时 初始化模型的正确方法是什么 以便加载一次
  • 链接到 libcuda.so 时出现问题

    我被一个似乎很容易诊断和解决的问题所困扰 我有一个使用 CUDA 驱动程序 API 的 C 源文件 当我使用它编译时nvcc 可执行文件已生成并且可以正常运行 但是 当我尝试使用它来编译它时g 链接器抱怨对符号的未定义引用 usr lib
  • JSF 和 Spring 性能与较差的 JSP 性能

    我看到我的同事开发了一些 JSF 项目 这些项目在我看来速度非常慢 有人有同样的看法吗 我目前正在使用 jsp jstl 和 jQuery 作为 富 客户端 我想知道现代框架 jsf wicket tapestry 相对于旧的普通 jsp
  • 使用 XPATH 子字符串函数

    我需要帮助弄清楚这个 XPATH 子字符串函数 但我无法使用它 我尝试过这种方法的各种变体 a contains text Home href substring jsessionid 12 尝试从此标签获取 jsessionid 值 a
  • Web 服务与 WCF

    我正在从事 ASP NET 应用程序 NET 4 框架 设计 想了解使用 Web 服务与 WCF 技术的优缺点和最佳实践是什么 该应用程序最终将被外部客户端用来消费数据 您什么时候会使用 WebServices 什么时候会使用 WCF 其中
  • 如何以高质量保存绘图?

    我用情节制作的每张图表在保存之前看起来都很棒 所以图像看起来有点哑光 如果有意义的话 质量真的很差 有谁知道如何高质量保存它 您可以使用此基本图表作为示例 library plotly x lt c 1 100 random y lt rn
  • 使用 Apache 的 .htaccess 使子目录不受密码保护

    目前在我的服务器上 我的 Web 目录的根目录中有一个 htaccess 文件 AuthUserFile path to root www htpasswd AuthType Basic AuthName Economic Complexi
  • 架构问题:使用依赖注入导致垃圾 API

    我正在尝试创建一个类 它执行各种与数据库相关的低级操作 但为 UI 层提供了一个非常简单的界面 此类表示全部位于特定聚合根内的一堆数据 由单个 ID int 检索 构造函数有四个参数 public AssetRegister int cas