问题标签 [service-locator]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
dependency-injection - 验证我理解 IoC、Ioc Container、DI 和服务定位器之间的区别
阅读许多有关这三个成语之间差异的帖子。但更困惑,然后我遇到了这篇文章: http ://martinfowler.com/articles/injection.html
只是想看看我是否做对了。如果我错了,请纠正我。请通知我更正和补充:
IoC- 是将应用程序与其使用的服务实现分离的概念。该应用程序包含对 Iservice 的引用,并且不负责实例化具体服务。
至少有两种方法可以实现:
DI - 具体服务作为 ctor 参数注入/抛出一个 setter/throw 接口注入(后者是什么意思?)
ServiceLocator - 是一个知道应用程序可能需要的所有具体服务的组件。应用程序明确要求定位器提供具体服务。
*IoC 容器实际上是一个控件的工厂(“提供者”)。
我对文章中的“何时更喜欢(1)或(2)”部分感到有些困惑。有人可以用外行的话从他自己的经历中说出来吗?
“服务定位器由于其更直接的行为而略有优势。但是,如果您正在构建要在多个应用程序中使用的类,那么依赖注入是一个更好的选择。”--> 定位器如何更直接?因为它显式地使用方法调用?当有多个应用程序时,使用 DI 有什么好处?
c++ - 关于服务定位器模式
服务定位器似乎是一个非常有用的概念,我想在我的应用程序中实现它。但是,我有几个关于它应该如何实现以及它应该如何与其他编程范式结合使用的问题。
SL 应该管理它存储的服务吗?也就是说,当 SL 被销毁时,它应该也销毁服务本身,还是应该将其留给注册服务的人?
依赖注入呢?既然我有一个 SL,那么将 SL 作为参数传递是否有任何意义,或者我应该全局访问它吗?毕竟,SL 也涵盖了 DI 的大部分目的,我不想再用一个参数来混淆我的很多函数。
asp.net-mvc - MVC3、Ninject、MvcSiteMapProvider - 如何将依赖项注入被覆盖的方法
我有一个使用Ninject和MvcSiteMapProvider的 MVC3 应用程序。
我创建了这个类,MvcSiteMapProvider 使用它来动态地将节点添加到我的站点地图:
MvcSiteMapProvider 自己实例化这种类型,所以我不确定如何将我的存储库注入其中。
我考虑通过获取内核句柄并调用Get<Repository>()
该方法来使用服务位置。但是,我在查看 NinjectHttpApplication 的定义时看到了这个属性:
Do not use Ninject as Service Locator
?!我该怎么做呢?然后我在stackoverflow上找到了这个问题,所有答案都说不要使用服务位置。
我应该做些什么?
data-binding - EntryPointNotFoundException - 在 Expression Blend 4 中加载 MVVM Light View 时未找到入口点
我发布了这个问题,以便我可以记录解决方案,因为我发现解决它非常棘手且耗时。
我在 Silverlight 4 项目中使用了Laurent Bugnion出色的MVVM Light Toolkit,并且我在 Microsoft.Practices.ServiceLocation 中使用了他的ViewModelLocator模式。ServiceLocator为可混合性加载设计时模型。最初在Expression Blend 4中加载视图是有效的,并且设计时数据绑定非常好。这在某个时候停止工作,Blend 中根本没有任何错误消息。
我使用Visual Studio 2010 SP1附加到Blend.exe来调试问题。在这行代码中抛出了EntryPointNotFoundException (Entry point was not found) 异常:
奇怪的是,我能够在 Visual Studio XAML 设计器中成功加载相同的视图,而我的设计时数据绑定工作正常。我使用另一个 Visual Studio 实例将调试器附加到托管 XAML 设计器的 Visual Studio 实例,并且能够确认 ServiceLocator 调用已成功执行。
异常详细信息(堆栈跟踪、InnerExcetion 等)没有为我提供有关问题的任何进一步线索,并且对无用错误消息的各种 Internet 搜索未能进一步阐明。
我最终幸运地使用了 Visual Studio 即时窗口来执行导致问题的部分代码行,并得到了更好的错误消息:
“Microsoft.Practices.ServiceLocation.dll”和“Microsoft.Practices.ServiceLocation.dll”中都存在“Microsoft.Practices.ServiceLocation.ServiceLocator”类型
将变更集与之前工作的代码进行比较,我注意到我在Silverlight 项目的单独单元测试框架(它引用了 UI 项目)中添加了对 GalaSoft.MvvmLight.Extras.SL4 的引用。该测试项目从 C:\Program Files (x86)\Laurent Bugnion (GalaSoft)\Mvvm Light Toolkit\Binaries\Silverlight4 引用程序集,而 UI 项目从 ..\packages\MvvmLightLibsPreview.4.0.0\ 引用它库\SL4。我曾使用nuget包MvvmLightLibsPreview将 MVVM Light 添加到客户端项目。
混合结果 - 错误和输出窗口在任何时候都没有显示任何错误消息。显然,除非有一些 Blend 故障排除技术可以帮助我更快地解决问题,否则不需要真正的答案。
c# - 处理与服务定位器模式一起使用时 MongoDB 如何存储 DateTime
我和我的同事在辩论中陷入僵局,非常感谢其他人的意见。
我们利用服务定位器模式和通用接口来抽象我们所有的数据访问,以便我们可以随着需求的变化在不同的数据源之间轻松交换。我们的调用代码没有指示数据存储在哪里或如何存储。它只是通过从服务注册表提供的服务访问数据。
当我们在对象上有 DateTime 字段并将其存储到 MongoDB 数据源时,就会出现我们正在辩论的问题。
我注意到的是,当我们在 C# 中有一个带有 DateTime 的对象时,它会显示为正确的时间。当我们使用 MongoVUE 登录到 MongoDB 服务器以检查对象时,它会显示正确的时间。但是当我们检索对象时,DateTime 现在是 UTC。当将内存中的 DateTime 与从 MongoDB 数据源检索的对象中的 DateTime 进行比较时,这显然会产生问题。
我了解 Mongo 在内部将 DateTime 存储为 UTC 时间。我什至理解为什么当你调用它时它可能会返回 UTC。
这是辩论开始的地方。
有人建议这只是一个外观问题,仅在显示日期时出现问题。因此,我们应该在接口层中简单地调用 .ToLocalTime。我不同意并断言这危险地破坏了我们在实现服务定位器模式时创建的抽象层。它还提出了有关与这些日期时间的交互的问题,因为它与触发其他事件有关。
我在其他地方读到的内容是我们应该将我们的时间存储为字符串,特别是作为 UTC 格式的某种标准。以这种方式,接口层不知道也不关心 DateTime 是如何存储的,我们的对象也不知道,因为每个数据源都会以相同的方式存储该字符串。
我使用 ISO 1806 格式成功地做到了这一点,但我的同事认为这是一个“hacky”修复,使用 .toLocalTime 是处理这种情况的适当方法。
我对其他人对这个话题的看法很感兴趣。
预先感谢您的意见。
generics - 如何使用 Unity Container 解析的泛型接口作为构造函数参数来解析泛型类
我不知道如何用我的 Unity (2.0) 容器注册一个具有注入通用接口的通用抽象类。这是接口和类:
这是注册码:
这是我的提供者工厂,它试图解决ReportProvider<,>
:
我得到,“无法构造类型 ReportProvider`2。您必须配置容器以提供此值,”_serviceLocator.GetService(...)
在线。
ioc-container - 服务分辨率/位置和参数
您如何将参数传递给解析器以创建对象?
我有一个要传递给数据服务对象的 UoW 对象,我希望能够确保使用一个 UoW 对象创建以特定顺序创建的数据服务对象
例如
选项 1,将 IUoW 传递给 Resolver.GetService 调用 - 不了解 IDataServiceX 实现的构造函数
选项 2,为 IUoW 添加一个属性到 IDataServiceX - 不设置它很容易,程序员怎么知道需要设置这个属性
inversion-of-control - 使用 Specflow 和 WatiN 进行 IOC(simpleServiceLocator)设置测试
我使用 Specflow 和 WatiN 进行了一些验收测试,但不确定在哪里为我的 IOC 容器 (SimpleServiceLocator) 设置注册。
在我的网站上,注册是在我的 global.asax 上完成的。
在我的测试项目中,我尝试使用 [BeforeScenario] 方法使用以下代码设置它们
我在我的应用程序项目中使用了一个对象实例
但我收到一个错误“对象引用未设置为对象的实例”。因为 ServiceLocator.Current 为 null ...
php - 为什么服务定位器在以下示例中是反模式?
我有一个 MVC 应用程序,其域模型定义良好,具有实体、存储库和服务层。
为了避免必须在我的控制器中实例化我的服务类,从而使我的控制器与不适合它们的逻辑混淆,我创建了一个充当某种Service Locator的助手,但在阅读了一些内容之后,我意识到许多开发人员:
- http://blog.tfnico.com/2011/04/dreaded-service-locator-pattern.html
- http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx
- http://underground.infovark.com/2010/06/18/the-service-locator-pattern-is-the-new-global-variable/
- http://www.andyfrench.info/2011/05/service-locator-anti-pattern_17.html
假设服务定位器实际上是一种反模式。但我认为我的实现不是反模式。
他们认为服务定位器是反模式的原因是因为它隐藏了依赖项,但是,我注入了唯一需要的依赖项(实体管理器,并且这个依赖项可能不会改变,因为它在服务接口的签名中)通过服务类,在我实例化服务定位器时。
这是我的代码:
向前端控制器注册动作助手:
以及我如何在我的控制器中使用这个 Helper:
- 我的实现是否正确?
- 真的是反模式吗?
- 我可能面临哪些可能的问题?
- 如何重构我的代码以消除这种反模式,但继续使用该功能?
c# - 领域驱动设计:在不使用服务定位器的情况下从实体访问配置的值
我有一个User
实体,该实体具有一个HasCompletedSecurity
属性,该属性指示该特定对象是否User
已回答系统要求的安全问题的数量。系统需要的安全问题的数量是可配置的,并且可以从配置文件中检索。类应该如何User
访问配置的信息?
我目前有一个IConfigurationService
接口,在该接口后面我有使用ConfigurationManager
或 Azure 等效项(如果可用)的实现。我已经通过一个静态InjectionService
类封装了对我的 DI 容器的访问,并且目前正在解析配置的值,如下所示:
这当然是ServiceLocator 反模式的一个例子,我一点也不喜欢它。静态依赖使得单元测试任何使用这个类的东西都很尴尬。
我正在使用实体框架并从这里得到提示我不想通过 DI 容器传递我的实体以给它们它们的依赖项,所以......我应该如何访问配置的值呢?
编辑:一方面有这个确切的例子(我很欣赏关于它的正确架构的建议),我感兴趣的更大的问题是你如何管理实体对服务的非静态引用?以您永远不需要的方式构建实体的答案是什么?