服务定位器和依赖注入之间的实际区别是什么?

2024-05-18

我正在经历之前的讨论,其中详细讨论了服务定位器和依赖项注入器之间的区别,但我仍然无法理解。 我可以在没有任何代码的情况下获得一般响应吗?


此代码示例应用了依赖注入 http://en.wikipedia.org/wiki/Dependency_injection原则:

public class UserService : IUserService
{
    private IUserRepository repository;

    // Constructor taking dependencies
    public UserService(IUserRepository repository)
    {
        this.repository = repository;
    }
}

此代码示例使用服务定位器 http://en.wikipedia.org/wiki/Service_locator_pattern图案:

public class UserService : IUserService
{
    private IUserRepository repository;

    public UserService()
    {
        this.repository = ObjectFactory.GetInstance<IUserRepository>();
    }
}

这是服务定位器模式的实现:

public class UserService : IUserService
{
    private IUserRepository repository;

    public UserService(Container container)
    {
        this.repository = container.GetInstance<IUserRepository>();
    }
}

甚至这是服务定位器模式的实现:

public class UserService : IUserService
{
    private IUserRepository repository;

    public UserService(IServiceLocator locator)
    {
        this.repository = locator.GetInstance<IUserRepository>();
    }
}

不同之处在于,通过依赖注入,您可以将消费者所需的所有依赖项注入消费者中(但没有其他任何依赖项)。注入它的理想方法是通过构造函数。

使用服务定位器,您可以从某些共享源请求依赖项。在第一个示例中,这是静态的ObjectFactory类,而在第二个示例中,这是Container注入到构造函数中的实例。尽管容器本身是使用依赖注入来注入的,但最后一个代码片段仍然是服务定位器模式的实现。

您应该使用依赖注入而不是服务定位器有几个重要原因。这篇文章很好地解释了这一点 http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx.

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

服务定位器和依赖注入之间的实际区别是什么? 的相关文章

  • 使用 Castle Windsor IoC 容器注册组件期间设置 Name 属性

    在我的应用程序中 我有一个名为 Message 的类 Message 类中存在一个名为 MessageType 类型为字符串的属性 MessageType 属性用于提醒应用程序 Message 类的实例中将存在什么数据模式 Message
  • 动态更改 FOSUserBundle 的服务参数值

    我问的是对 FOSUserBundle 使用多个实体管理器 https stackoverflow com questions 14475180 multiple entity manager for fosuserbundle之前 事实证
  • GWT GIN 现场级注入

    我们正在评估 GWT 项目中使用 GIN 的情况 并通过构造函数参数进行典型注入 取得了良好的结果 我们遇到的困难是现场级注入 这些字段最终总是为空 有没有人有一个很好的例子来说明如何使用 GIN 正确实现字段级注入 Update 这是一些
  • 简单的注入器和内部构造函数

    我正在开发一个小型类库 并为我的 DI 使用简单注入器 类库有一个访问点 我猜是某种服务 它是public它有一些internal服务和存储库 我看到 Simple Injector 不支持使用内部构造函数进行构造函数注入 例如 我的产品服
  • 在非 Angular 类中获取注入的依赖项

    我有当前的 和简化的 课程 export class NavigationItem constructor private router Router navigateTo this router navigate this id 我不想每
  • 如何在 servlet 线程中获取新的有状态会话 bean?

    我正在尝试 EJB3 我想将一个有状态会话 bean 注入到 servlet 中 以便每个访问该 servlet 的用户都会获得一个新的 bean 显然 我不能让 bean 成为 servlet 的实例变量 因为它将被共享 显然不允许注入局
  • Spring Boot中服务接口类的用途

    我的问题是关于接口类的使用 我对 Spring 还很陌生 所以如果这过于简单 请耐心等待 首先 当您可以在 BoxService 中声明 find all 时 这里拥有 IBoxService 接口有什么意义 其次 在控制器中如何使用IBo
  • Typescript:如何在依赖项中返回正确的类和泛型类型

    我试图找到一种方法将一个对象注入另一个对象 依赖注入 其中容器对象可以返回正确注射对象类型 使用重载怎么样 function createMyClass2
  • CDI 对象无法使用注入的构造函数进行代理

    当尝试将参数注入 CDI bean ApplicationScoped 的构造函数时 我遇到以下问题 Caused by org jboss weld exceptions UnproxyableResolutionException WE
  • 以编程方式注入依赖项asp.net core

    我刚刚开始Asp net core 依赖注入 我的概念可能不准确 这篇 docs asp net 帖子 https docs asp net en latest mvc controllers dependency injection ht
  • 如何在单独的文件中使用 FastAPI Depends 作为端点/路由?

    我在单独的文件中定义了一个 Websocket 端点 例如 from starlette endpoints import WebSocketEndpoint from connection service import Connectio
  • 通用接口依赖注入工厂

    我正在玩 DI 和 Ninject 我愿意征求有关如何以其他方式解决此问题的建议 我试图确保 ICreateOrders 的具体实现可以被替换 如果需要的话 也许还有另一种方式或模式 像这样的解决方案 C Ninject IoC 和工厂模式
  • 需要 WCF 的完整 DI 示例

    有人有完整且有效的 WCF DI 示例吗 Every http www eggheadcafe com tutorials aspnet b428fb65 08b4 45c8 97cd 47ee1a1eaf41 composing wcf
  • 依赖注入容器——工厂模式

    我一直在尝试了解依赖注入 并一直在阅读并尝试编写一个类似于以下内容的小型依赖注入容器 http fabien potencier org article 12 do you need a dependency injection conta
  • 如何注入“运行时”依赖项,例如登录用户,该依赖项在应用程序启动时不可用?

    我只是不明白这个 我在我的 java GWT 应用程序中使用 Gin 来进行 DI 登录屏幕集成到完整的应用程序窗口中 用户登录后 我想将用户对象注入到我创建的其他类 例如 GUI Presenters 中 因此我相信存在某种运行时依赖性
  • 使用 asp.net mvc 4 的简单注入器,从另一个程序集加载控制器

    我正在开发一个 asp net mvc 4 站点 使用 Simple Injector 作为 Ioc 工具 这将是一个可插拔的架构 某些控制器和视图位于另一个程序集中 另一个 mvc4 应用程序 Plugin Web dll 从主应用程序中
  • 设置惰性静态变量首先初始化然后分配?

    我意识到static变量是隐式的lazy 这真的很棒 执行以下操作在第一次调用之前不会创建实例 static var test Test 但是 将一个新实例分配给static变量初始化原始实例 然后分配新实例 这对我来说很麻烦 SomeTy
  • 传统 3 层架构与带 IOC 的 3 层架构

    我正在构建一个包含表示层 PL 业务逻辑层 BLL 和数据访问层 DAL 的 3 层架构 传统的 3 层架构逻辑指出 BLL 应充当 PL 和 DAL 之间的中介 PL 甚至不应该知道数据库的存在 而 DAL 不应该知道 BLL 或 PL
  • 依赖注入在 C++ 中有用吗

    C uses 依赖注入 DI 很多有一个lossless and testable平台 为此 我需要一个interface也许还有一个DI or 控制反转 IoC 容器为了解决我的情况 但是在 C 中如何做到这一点呢 我读过一些相关内容 似
  • asp.net mvc 4 - 可以在每个线程共享 DbContext 吗?

    From 每个 Web 请求一个 DbContext 为什么 https stackoverflow com questions 10585478 one dbcontext per web request why 我的理解是 DbCont

随机推荐

  • if else 在 ansible 打印语句中

    我需要有关具有多个条件的打印语句的语法的帮助 目前 报价为 inventory hostname 导致错误 如果我删除剧本运行的引号 但列出文本 inventory hostname 而不是变量 我想知道如何打印变量以及 if else 语
  • C++ 获取 catch(...) 块中捕获的异常的描述

    我可以得到捕获的异常的描述吗 catch 堵塞 就像是 what std 异常 您可能可以使用一个技巧 catch handle exception void handle exception try throw catch const s
  • WebUSB API 和 PC/SC 智能卡读卡器

    是否在WebUSB API 起草的there https wicg github io webusb 能够使用 PC SC 设备 例如智能卡读卡器 或许假设它们符合 CCID 标准 许多设备接近这一标准并且可以使用通用驱动程序 如果是 是否
  • Django“和”Pinax 还是只是 Pinax?

    我正在开发一个个人项目 该项目已 完成 但现在我想添加一个社交应用程序 我认为 Pinax 已经为这项任务做好了准备 我想知道一些事情 我可以在我的项目中像 django 应用程序一样使用 pinax 吗 或者我需要使用 pinax 重新设
  • 如何使用 ObjectDataProvider 将枚举绑定到 XAML 中的 ComboBox

    我正在尝试绑定一个Enum to a ComboBox 我见过很多人使用ObjectDataProvider但我似乎无法访问它 我还注意到有些人在一段时间内使用它Window Resources 而不是Page Resources但我找不到
  • emacs 是否有类似 vims 的 NERDtree 之类的东西

    对于 vim 有一个名为 NERDtree 的文件系统浏览器 https github com scrooloose nerdtree https github com scrooloose nerdtree Emacs 确实存在替代或更好
  • 所需框架与静态库

    构建现代框架 https developer apple com videos play wwdc2014 416 says 每个应用程序都有自己的自定义框架副本 https stackoverflow com a 15262463 242
  • 无法获取未知等级的 Shape 长度

    我有一个神经网络 来自tf data数据生成器和tf keras模型 如下 简化版本 因为太长 dataset A tf data Dataset反对与next x方法调用get next为了x train迭代器和next y方法调用get
  • 在ubuntu 12.04上安装nodejs和npm后找不到.npmrc文件

    我刚刚按照教程在我的 ubuntu 12 04 上安装了 nodejs 和 npm https gist github com dwayne 2983873 https gist github com dwayne 2983873 现在安装
  • 什么是 S 表达式

    所有 Lisp 开发人员似乎都知道什么是 S 表达式 但有人能为非 Lisp 开发者解释一下这一点吗 已经有一个维基百科条目 https en wikipedia org wiki S expression https en wikiped
  • 如何在golang中解析JSON而不需要解组两次

    我有一个 Web 套接字连接 它在 JSON 对象中发送不同类型的消息 并且我想将内容解组到一些已知的结构中 为此 我认为我应该执行以下操作 步骤 1 将 JSON 解组为通用映射 字符串 接口 步骤 2 找到我要找的钥匙 步骤 3 尝试将
  • Shoulda/RSpec 匹配器 - 条件验证

    在我的代码中 我使用 Shoulda 匹配器进行了以下验证 效果很好 it should validate presence of name 在我的模型中 我已将条件添加到验证中 validates presence of name if
  • 通过引用传递向量

    如果我在一个类中有一个对象向量 我想在另一个类中更改它 我会尝试通过引用传递所有信息 我究竟需要通过引用传递什么 向量 物体 两个都 本质上我要问的是 它们之间有什么区别 vector blah A reference to a vecto
  • 如何在 Libgdx 中获取字符串宽度?

    我想知道如何获得width我的字符串的像素数 位图字体 API 测量宽度String你用你的Font并得到bounds of the String 你要画画了 BitmapFont getBounds String str width 位图
  • Matplotlib 与多处理冻结计算机

    我对 matplotlib 和多重处理有疑问 我启动第一个进程 在其中显示图像并选择一个区域 然后关闭图形 然后我启动另一个进程 在其中调用定期更新的图形函数 至此 一切正常 然后 当我尝试使用相同的图形功能启动另一个进程时 它冻结了我的整
  • 如何忽略 Pydev Eclipse 中特定的未定义变量

    我正在使用 Eclipse 和 Pydev 插件在 Windows 上编写跨平台 python 脚本 该脚本利用os symlink and os readlink 如果当前平台不是 NT 则使用方法 自从os symlink and os
  • 具有默认值的 Java JAX-RS 自定义参数

    假设我有这个 这只是一个示例 GET Path value address Produces application json public Response getAddress QueryParam user User user 用户是
  • iOS 滚动视图允许滚动过去的内容

    我正在努力优化我的应用程序以适应横向和较小的屏幕 我主要使用滚动视图来实现这一点 在我的其中一个视图中 我有一个容器视图 当我在故事板中的设备之间切换时 这个容器视图看起来很完美 容器视图映射到具有滚动视图的视图控制器 该滚动视图的顶部 底
  • 什么是“数据库实体”以及哪些类型的 DBMS 项目被视为实体? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 服务定位器和依赖注入之间的实际区别是什么?

    我正在经历之前的讨论 其中详细讨论了服务定位器和依赖项注入器之间的区别 但我仍然无法理解 我可以在没有任何代码的情况下获得一般响应吗 此代码示例应用了依赖注入 http en wikipedia org wiki Dependency in