依赖注入架构设计——服务类循环引用

2024-01-31

我有以下服务类别:

public class JobService {
  private UserService us;

  public JobService (UserService us) {
    this.us = us;
  }

  public void addJob(Job job) {
    // needs to make a call to user service to update some user info
    // similar dependency to the deleteUser method
  }
}

public class UserService {
  private JobService js;
  public UserService(JobService js) {
    this.js = js;
  }

  public void deleteUser(User u) {
    using (TransactionScope scope = new TransactionScope()) {
      List<IJob> jobs = jobService.findAllByUser(u.Id);
      foreach (IJob job in jobs) {
        js.deleteJob(job);
      }
      userDao.delete(user);
      scope.Complete();
    }
  }
}        

这些服务类中的每一个都由 IoC 容器实例化,并且不存在功能问题,但对我来说,这种方法存在潜在的设计缺陷,我想知道是否有更有意义的替代方法。


正如有人已经指出的那样,问题不在于 DI 容器的限制,而在于您的设计。

我明白你有一个单独的原因UserService and a JobService其中包含彼此的引用。这是因为两者UserService and JobService包含一些需要其他服务作为参考的逻辑(添加作业需要添加用户等)。但是,我认为您不应该从一项服务引用另一项服务。相反,您应该在服务背后有另一个抽象层,服务将使用该抽象层来实现通用逻辑。因此,服务将包含不能(不应该)重用的逻辑,而帮助程序将包含共享逻辑。

例如:

    public class UserHelper{
      //add all your common methods here
    }
    public class JobService {
      private UserHelper us;

      public JobService (UserHelper us) {
        this.us = us;
      }

      public void addJob(Job job) {
 // calls helper class
      }
    }

    public class UserService {

      public UserService(UserHelper js) {
        this.js = js;
      }

      public void deleteUser(User u) {
        // calls helper class
      }
    }   

通过这种方式,您不会遇到任何循环引用问题,并且您将拥有一个位置来包含需要由不同服务重用的逻辑。

另外,我更喜欢拥有彼此完全隔离的服务。

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

依赖注入架构设计——服务类循环引用 的相关文章

  • 从 C 中的 char* 获取单个字符

    有没有办法在 C 中逐字符遍历或从 char 中提取单个字符 考虑以下代码 现在获得单个角色的最佳方式是什么 建议我一种不使用任何字符串函数的方法 char a STRING 其他方式 char i for i a i i i points
  • 如何重命名序列化对象列表后生成的 XML 属性

    我正在序列化对象列表List
  • dup2() 和 exec()

    include
  • C++ 和序列化:有什么方法可以进行某种内省吗?

    我读过一些例子维基百科 http en wikipedia org wiki Type introspection C 2B 2B但我正在寻找一些现实生活中的例子 如何使用内省 为什么 它有助于编写干净的代码 以及代码本身 例如 有没有办法
  • C# 并行与并行线程代码性能

    我一直在测试 System Threading Parallel 与线程的性能 我很惊讶地发现并行比线程花费更长的时间来完成任务 我确信这是由于我对并行的了解有限 我刚刚开始阅读 我想我会分享一些片段 如果有人可以向我指出并行代码比线程代码
  • 增量决策树 C++ 实现

    有谁知道决策树分类器的增量实现吗 这样 当您将新实例添加到训练集中时 它可以根据现有决策树分类器以低计算量并尽可能快地生成最佳决策树分类器 换句话说 我有一个最优决策树分类器集A 其中命名为T 1 现在我想添加实例X to set A并找到
  • boost::asio::io_service 是否保留处理程序的顺序?

    Does boost asio io service http www boost org doc libs release doc html boost asio reference io service html保证处理程序的调用顺序与
  • 为什么我不能从对中返回 unique_ptr?

    为什么我不能从对中返回 unique ptr include
  • ASP.NET中如何访问除wwwroot以外的位置

    我可以使用访问服务器的物理位置Server MapPath 这给了我内部的物理路径wwwroot文件夹 我想将一些数据保存到同一服务器的另一个驱动器中D 驾驶 我想我无法获取以下位置的物理位置D 驾驶使用Server MapPath因为它位
  • 将授权标头添加到 Web 参考

    我正在尝试向客户端的网络服务发出请求 我不知道客户端的底层平台 我使用 添加 Web 引用 在 Visual Studio 2010 中使用了客户端的 WSDL 并生成了我的代理类 称为 ContactService 我现在需要将如下所示的
  • #define 内存地址声明

    这个 define 语句有什么作用 它用于定义内存地址 但我不明白 uint32 t 部分 define GPxDAT uint32 t 0x6FC0 通常用于访问映射到地址空间的硬件寄存器 或者一些特定的内存地址 硬件寄存器应定义为vol
  • 使用非字符串作为字符串(而不是自动使用 ToString)时如何显示错误?

    建议的重复确实是一个类似的问题 然而 答案只涵盖一种选择 禁用 ToString 本身 还有其他可能的解决方案 例如让 Visual Studio 警告我 或者不调用 ToString 仔细阅读那里的答案 他认为is调用 只是解释说没有办法
  • 返回 ICollection 而不是 List 的真正优势是什么? [复制]

    这个问题在这里已经有答案了 我读过几篇博客文章 提到对于公共 API 我们应该始终返回 ICollection 或 IEnumerable 而不是 List 返回 ICollection 而不是 List 的真正优势是什么 Thanks 复
  • C# 3.0 中自动属性和公共字段的区别

    我无法理解为什么 C 3 0 中存在自动实现的属性语言功能 当你说的时候有什么区别 public string FirstName than public string FirstName get set 因为它们在生成的 IL 代码 和机
  • 用于 nmap 输出的 C++ xml 解析器

    我是 nmap 的新手 我在 nmap 教程中看到 https nmap org book man output html https nmap org book man output html oX 选项可用于获取 xml 格式的 nma
  • 是否可以编写一个在另一个 Windows 应用程序中选择文本时收到通知的 Windows 应用程序?

    我很好奇是否可以编写一个程序来监视我的文本选择 一种可能的用途是编写一个与编辑器 IDE 无关的代码格式化程序 应用程序 服务 P 启动并以某种方式挂接到窗口中 以便在任何窗口中选择文本时收到通知 启动其他一些应用程序 A 用户选择 A 中
  • char[length]初始化并处理

    我定义了一个字符数组 char d 6 如果我在以下方面有误 请纠正我 此时没有为变量分配内存d 现在我要初始化它 d aaaaa 这种初始化之后 就不需要释放内存了 它将自动完成 我怎么知道是否char 被初始化了吗 我正在寻找类似的模式
  • 替换全局热键

    我有一个位于托盘中的应用程序 我想定义多个热键来触发我的程序中的事件 我从 AaronLS 在这个问题中的出色回答中找到了灵感 使用C 设置全局热键 https stackoverflow com a 27309185 3064934 如果
  • asp.net mvc GET 请求上的 formcollection 应该为空

    我正在发布一个简单的操作 public void Login FormCollection formCollection 即使查询字符串值很少 formcollection Count is 0 是靠行为吗 FormCollection 使
  • C#:如何处理乱序 TCP 数据包?

    请有人解释一下如何处理乱序数据包 我使用原始套接字来捕获数据包 并在数据包到来时解析它们 但其中一些数据包的顺序错误 例如 ID 标志 16390 PSH ACK 16535 PSH ACK 16638 确认 16640 PSH ACK 1

随机推荐

  • 删除行中重复的字符串

    出现以下问题 我有数据框 data1 其中包含多个条目的变量 data1 lt data frame v1 c test test bird bird bird car 现在我想删除每行中的重复条目 结果应该是这样的 data1 final
  • 在 Jquery 日期选择器中禁用 Next

    有没有其他方法可以让用户选择下个月 我已经完成了一些线程 但我不想通过使用本中指示的步骤功能来禁用下一个和上一个按钮link https stackoverflow com questions 3501808 jquery datepick
  • 如何通过 xcode 4.2 故事板正确使用模态视图控制器

    我想知道如何正确使用故事板以模态方式放置视图控制器 就我个人而言 我更喜欢与 xibs 合作 但故事板似乎越来越受欢迎 并且将成为未来的发展方向 我通常以模态方式放置视图控制器的方式是这样的 假设我们有 ViewControllerA 简称
  • Laravel 自定义身份验证过滤器

    我已在控制器中使用 Route Intended 将标准身份验证过滤器添加到多个路由 假设登录成功 过滤器 php Route filter auth function if Auth guest return Redirect guest
  • TreeMap<> 操作的时间复杂度:get() 和 subMap()

    基于这篇文章 TreeMap 操作的时间复杂度 subMap headMap tailMap https stackoverflow com questions 14290751 time complexity of treemap ope
  • “函数式编程”的含义很明确,但是“函数式语言”有明确的含义吗?

    我非常清楚函数式和命令式之间的区别编程技术 但是现在有一种普遍的趋势是谈论 函数式语言 这确实让我感到困惑 当然 像 Haskell 这样的一些语言是更热情好客但即使是前者也可以进行 I O 它只是将其保留在贫民窟中 你可以用 C 语言编写
  • 以编程方式将证书导入 IIS?

    我有一个 SSL pem 证书 我想将其与 MSI 中的 Web 应用程序一起分发 必须在客户端计算机上运行 然后 我需要将其导入 导入到某些凭据存储中 并告诉我的站点绑定使用它 但我怎样才能在代码中做到这一点呢 我发现了 Microsof
  • “case_when”函数中“~”后面的条件项

    我想在后面加上一个条件项 in a case when功能 我的例子 df df lt structure list x c a a a b b b c c c a a a y 1 12 class data frame row names
  • 在 Evernote API 中设置 NoteFilter

    我已经像这样设置了我的 Python 页面 摘录 import evernote edam userstore constants as UserStoreConstants import evernote edam type ttypes
  • 指向匿名结构的 C 指针

    有没有办法获取指向匿名结构的指针 如果没有匿名结构 我可以编写以下内容 struct a int z struct b int y struct a x 这工作正常 但我只使用struct a within struct b用它来污染全局命
  • 正则表达式搜索 C++

    include
  • 将列添加到 SQL 查询结果

    我正在 SSRS 中整理一份报告 该数据集由 MS SQL 服务器的 SQL 查询填充 它使用 Union All 查询几个相似的表 问题是存在一些信息丢失 不同的表对应不同的工作地点 但这些表中没有一列包含该地点的名称 识别站点的唯一方法
  • Vue中,template、render、VNode是什么关系?

    在开发vue项目的过程中 遇到一些疑问template render VNode 阅读文档后https v2 vuejs org v2 guide syntax html https v2 vuejs org v2 guide syntax
  • 如何从 Yahoo! 抓取关键统计数据使用 R 进行财务? [复制]

    这个问题在这里已经有答案了 不幸的是 我还不是一个经验丰富的爬虫 然而 我需要使用 R 从雅虎财经抓取多只股票的关键统计数据 我对使用 rvest 包中的 read html html nodes 和 html text 直接从 html
  • 内嵌文本 - 带填充的背景颜色

    我需要制作一个背景颜色不是块的标题 只有文本背景是彩色的 Here is an image of what I have to archieve 这是我到目前为止所得到的 http jsbin com tiwuquze 1 edit htt
  • Textmate 中的自动完成

    有时我会观看有人使用文本伴侣的屏幕截图 我是一名 Rails 开发人员 所以这些是 Rails 屏幕截图 他们会输入如下内容 def 例如 并且 end 会自动出现在下面 我确实启用了 Rails 捆绑包 为什么我没有发生这种情况 Than
  • 使用 R 绘制二次回归线

    我对 R 很陌生 而且对 R 也很陌生plotly 我正在尝试绘制二次 即二次多项式 回归线 一旦一些价格与年份 以及相同的价格与某些整数列表 可以相同 比方说分数 本例中的数据是 price c 995 675 690 600 612 7
  • 如何强制 r optim 运行更多迭代?

    R Optim 比我想要的更早停止迭代 我使用 method L BFGS B 因为我需要不同参数的不同界限 我知道我可以通过 control gt maxit 设置最大迭代次数 但 optim 没有达到最大值 我想 control gt
  • Emacs - Ubuntu 初始化

    在 ubuntu 上加载 emacs 的行为很奇怪 似乎发生了一些初始化 这些初始化不在 emacs 中 也不在 emacs 报告通过 emacs debug init 加载的任何文件中 我发现了一些与字体相关的调整大小的参考 但这种行为似
  • 依赖注入架构设计——服务类循环引用

    我有以下服务类别 public class JobService private UserService us public JobService UserService us this us us public void addJob J