依赖注入 - 多个类方法中需要新实例

2024-01-07

我有一些代码看起来像这样:

public MyService(IDependency dependency)
{
    _dependency = dependency;
}

public Message Method1()
{
    _dependency.DoSomething();

}

public Message Method2()
{
    _dependency.DoSomething();  
}

public Message Method2()
{
    _dependency.DoSomething();  
}

现在我刚刚意识到,因为依赖对象包含内部状态信息。我需要在每个方法调用中新建一个新实例

那么,在没有更新具体实例的情况下,最好的方法是什么?

您会使用 IoC 容器并在每个方法中调用该容器吗?或者是否有一种更灵活的方法,您只能对容器进行一次调用?

如果我不使用 IoC 容器怎么办?是否有办法不在每个方法中新建具体实例?


到目前为止,这里的大多数答案都建议您将注入的依赖项类型更改为某种抽象工厂 http://en.wikipedia.org/wiki/Abstract_factory_pattern (a Func<T>也是一个抽象工厂)来解决这个问题。然而,如果你这样做的话,这将是一个漏洞抽象因为你会让对特定实现的了解决定了设计消费者的。这违反了里氏替换原则 http://en.wikipedia.org/wiki/Liskov_substitution_principle.

更好的选择是保持 MyService 原样,然后为 IDependency 创建一个包装器来解决特定的生命周期问题:

public class TransientDependencyWrapper : IDependency
{
    public void DoSomething()
    {
        new MyStatefulDependency().DoSomething();
    }
}

将其注入 MyService,而不是直接注入原始实现 (MyStatefulDependency)。

如果您想抽象出依赖项的创建,您始终可以在此级别注入抽象工厂。

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

依赖注入 - 多个类方法中需要新实例 的相关文章

随机推荐

  • 使用 PIL 或 Numpy 数组,如何从图像中删除整行?

    我想知道如何从图像中删除整行 最好是根据行的颜色 示例 我有一个高度为 5 像素的图像 顶部两行和底部两行是白色 中间行是黑色 我想知道如何让 PIL 识别这一行黑色像素 然后删除整行并保存新图像 我对 python 有一些了解 并且到目前
  • 当调用 onBlur 时,Firefox 中的 relatedTarget 为 null

    我正在尝试创建一条帮助消息 当用户单击切换按钮以显示帮助消息或通过单击页面上的其他位置来单击时 该消息将消失 解决方案似乎是查看relatedTarget的财产onblur事件并防止onblur处理程序从运行时relatedTarget是切
  • 如何在 Android 应用程序级别检查 SIM 卡锁定

    我正在寻找一种方法来查明 Android 设备是否已锁定 SIM 卡 我知道 efs 中应该是存储此设置的文件 问题是没有 root 就无法访问 efs USSD 代码如下 7465625 不再适用于 Samsung 设备上的 Androi
  • 用户控件与 Windows 窗体

    Visual Studio C 中的用户控件和 Windows 窗体有什么区别 非常简单地说 用户控件是一种制作自定义 可重用组件的方法 用户控件可以包含其他控件 但必须由窗体托管 Windows 窗体是控件 包括用户控件 的容器 虽然它包
  • 如何扩展 Google 地图中的共享位置 URL?

    我正在尝试从谷歌地图共享位置链接获取位置 因此我使用 Google Shorten URL API 来扩展 URL 但是当我从 Android 设备共享 Google 地图应用程序的 URL 时 它给了我https maps app goo
  • 自定义 HTTP 授权标头

    我想知道将自定义数据放入 HTTP 授权标头中是否可以接受 我们正在设计一个 RESTful API 我们可能需要一种方法来指定自定义授权方法 作为一个例子 我们称之为FIRE TOKEN验证 根据规范 这样的事情是否有效并允许 Autho
  • 什么是本机构建环境?

    我只是从互联网上阅读信息 目前cmake 关于页面 http www cmake org cmake project about html 我需要信息来填补空白 这有助于了解全局 我希望答案很简单 什么是本机构建环境 背景 我需要知道how
  • jQuery 设置单选按钮

    我正在尝试设置一个单选按钮 我想通过使用值或 ID 来设置它 这是我尝试过的 input radio name cols newcol attr checked true newcol是单选按钮的 id 也许需要进行一些编辑 有两组无线电盒
  • Cardview 中的 ConstraintLayout 添加空白

    我正在尝试创建一个CardView有一个ConstraintLayout组织一些TextView 有时它会按预期显示 但有时 它会添加额外的空白 例如当键盘关闭时 会破坏布局 我下面有一个 GIF 显示CardView在同一时间段内工作和不
  • 使用 SQL Server Server Management Studio 导入/导出数据库

    我认为这很简单 但事实并非如此 我确信有一种简单的方法可以做到这一点 但我无法找到它 我真丢脸 我想导入 导出数据库本身 表 约束 外键等 我宁愿不用它获取数据 但如果没有其他方法 我可以在之后删除它 那么 如何使用 MS SQL Serv
  • 如果没有发生左值到右值的转换,取消引用无效指针是否合法

    尽我所能 我见过的最接近的答案是this https stackoverflow com questions 7346634 dereferencing an invalid pointer then taking the address
  • YouTube 嵌入 iframe 未在 Safari 中显示

    链接是http thecodeclub org http thecodeclub org 还有一个 YouTube 视频 在 Chrome 中工作正常 但 iframe 在 Safari 中仍为空白 有其他人遇到过这个问题或者有解决办法吗
  • 如何在 JavaScript 中加载文本文件?

    我正在创建一个简单的 WebGL 项目 需要一种加载模型的方法 我决定使用 OBJ 格式 所以我需要一种方法来加载它 该文件 将 存储在服务器上 我的问题是 JS 中的文件如何加载到文本文件中并逐行扫描它 逐个令牌 就像 C 中的流一样 我
  • OpenGL ES 顶点着色器中动态调整大小的数组;用于混合形状/变形目标

    我即将执行混合形状 变形目标的 Opengl ES 实现 但我不太确定执行此操作的最佳方法 我面临的问题是我希望顶点数据的插值发生在 GPU 上 但我也希望混合形状的数量是任意的 澄清一下 我不希望我的顶点着色器看起来像这样 OpenGL
  • Wpf 动画最佳实践 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • async/await 函数内的 JavaScript Promise 解析最终的响应数组

    我是 JavaScript 和 Promises 方面的新手 我正在尝试构建从 API 获得的对象数组 为此 我在一个文件中构建了两个函数MyFile js 当 axios Promise 得到解决时 第一个返回一个 Promise 它是
  • 单击 ActionBar 中的后退按钮时不会调用 onActivityResult

    这是我的问题 创建一个主活动 添加一个按钮来启动另一个活动 SecondActivity Intent i new Intent getActivity SecondActivity class startActivityForResult
  • 使用 Java 进行 PGP 加密和解密 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想使用 PGP 密钥解密文件 我已经下载并安装了 PGP 密钥安装程序 我使用它创建了一个文本文件并使用 PGP 密钥加密了该文本文
  • 用于索引的 Cloud Firestore 通配符

    设置索引时 Cloud Firestore 中通配符级别的语法是什么 我知道有一个安全规则 Thanks Cloud Firestore 索引基于集合名称 不是完整的收集路径 所以如果你想创建索引users id messages 正确的方
  • 依赖注入 - 多个类方法中需要新实例

    我有一些代码看起来像这样 public MyService IDependency dependency dependency dependency public Message Method1 dependency DoSomething