问题标签 [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.

0 投票
5 回答
21272 浏览

silverlight - MVVM:如何将参数传递给 ViewModel 的构造函数

我正在使用 L. Bugnion 的 MVVM Light Framework。
将客户 ID 等参数传递给 ViewModel 的构造函数的推荐方法有哪些?

编辑:每个 ViewModel 我需要的参数不是跨模型共享的。它是每个视图模型实例所独有的。

0 投票
1 回答
1242 浏览

dependency-injection - ASP.NET MVC 3 RC 中的 MvcServiceLocator 在哪里?

我正在尝试将 Ninject 与我的 ASP.NET MVC 3 RC 应用程序结合起来。

从我找到的教程中,我应该通过设置 ServiceLocator

Global.asax文件中,但我似乎无法在 ASP.NET MVC 3 RC 中找到它。这是否已更改为其他内容?

0 投票
1 回答
878 浏览

dependency-injection - 如何通过配置文件进行 IServiceLocator 构造函数注入?

如何将 IServiceLocator 注入我的类构造函数?

当我尝试通过我的配置执行此操作时,如上所述,我得到了一个无法创建 RequestHandlersFactory 类的异常,因为统一找不到带有serviceLocatorassemblyName的构造函数。

我有两个接口

和两个班级:

现在我想创建统一配置文件:

我的配置代码:

0 投票
1 回答
267 浏览

unit-testing - Unity Service Locator:是否有提供的方法来测试配置是否有效?

在 StructureMap 中有一种方法可以测试您的配置是否有效,调用 StructureMap.ObjectFactory:

在 Unity 中是否有类似的功能?

0 投票
1 回答
198 浏览

dependency-injection - IoC 容器冲突

在我当前的项目中,我使用 SolrNet 和 OAuth.Net。两个库都使用 Common Service Locator。SolrNet 将自定义 IoC 容器实现设置为定位器提供程序。OAuth.Net 的定位器提供程序在我的代码中设置(目前我使用的是示例中使用的 Windsor)。问题从这里开始,因为

实际上是替换 ServiceLocator.Current 静态属性值。

有什么建议吗?在这种情况下,最佳实践是什么?

在此先感谢, Hristo

0 投票
1 回答
2627 浏览

dependency-injection - 构造函数注入以及何时使用服务定位器

我正在努力理解 StructureMap 的部分用法。特别是,在文档中声明了一种常见的反模式,即仅使用 StructureMap 作为服务定位器而不是构造函数注入(直接来自 Structuremap 文档的代码示例):

代替:

这对于一个非常短的对象图来说很好,但是当处理很多层次的对象时,这是否意味着您应该从顶部向下传递更深的对象所需的所有依赖项?当然,这会破坏封装并暴露太多关于更深层对象实现的信息。

假设我正在使用 Active Record 模式,因此我的记录需要访问数据存储库才能保存和加载自身。如果此记录加载到一个对象中,该对象是否调用 ObjectFactory.CreateInstance() 并将其传递给活动记录的构造函数?如果该对象在另一个对象内部怎么办。它是否将 IRepository 作为自己的参数从更远的地方开始?这将向父对象公开我们此时正在访问数据存储库的事实,外部对象可能不应该知道这一点。

任何想法将不胜感激。

西蒙

编辑: 意见似乎是注入应该从顶层开始。ActiveRecord 将被注入到 ThingThatNeedsRecord 中,而 ThingThatNeedsRecord 又被注入到 OuterClass 中。这样做的问题是,如果 ActiveRecord 需要使用运行时参数(例如要检索的记录的 id)进行实例化。如果我在顶部将 ActiveRecord 注入到 ThingThatNeedsRecord 中,我必须以某种方式弄清楚此时需要什么 id(它将顶层暴露给它不应该实现的实现),或者我必须有一个部分构造的 ActiveRecord并稍后设置 Id。如果我需要 N 条记录并且直到在 ThingThatNeedsRecord 中执行逻辑才会知道,这会变得更加复杂。

0 投票
1 回答
3768 浏览

dependency-injection - 使用 Ninject、MVC 3 和使用服务定位器模式的依赖注入

自从我阅读了关于另一个 stackoverflow 问题的答案(现在我不知道确切的问题)的答案以来,一直困扰着我的事情是,用户说“如果您正在调用服务定位器,那么您做错了。

这是一个声望很高的人(我想有几十万)所以我倾向于认为这个人可能知道他们在说什么。自从我第一次开始了解 DI 以及它与单元测试的关系以及不相关的情况以来,我一直在我的项目中使用 DI。这是我现在相当舒服的事情,我我知道我在做什么。

但是,有很多地方我一直在使用服务定位器来解决项目中的依赖关系。一旦主要示例来自我的 ModelBinder 实现。

典型模型粘合剂的示例。

不是真正的实现——只是一个简单的例子

由于第一次请求Binder 时 ModelBinder 实现需要一个新实例,因此不可能在此特定实现的构造函数上使用依赖注入。

我的很多课都是这样。另一个例子是缓存过期进程,只要缓存对象在我的网站中过期,它就会运行一个方法。我运行了一堆数据库调用,什么都没有。我也在使用服务定位器来获取所需的依赖项。

我最近遇到的另一个问题(我在这里发布了一个问题)是我所有的控制器都需要一个 IDataContext 的实例,我使用 DI 来处理它——但是一个操作方法需要一个不同的 IDataContext 实例。幸运的是,Ninject 带来了一个命名依赖项。然而,这感觉像是一个杂牌,而不是一个真正的解决方案。

我认为我至少对关注点分离的概念理解得相当好,但我对依赖注入和服务定位器模式的理解似乎存在根本性的错误——我不知道那是什么。

我目前理解它的方式 - 这也可能是错误的 - 是,至少在 MVC 中,ControllerFactory 为 Controller 查找构造函数并调用 Service Locator 本身以获取所需的依赖项,然后将它们传递进去。但是,我可以理解,不是所有的类和什么都没有工厂来创建它们。所以在我看来,一些服务定位器模式是可以接受的......但是......

  1. 什么时候不能接受?
  2. 当我应该重新考虑如何使用服务定位器模式时,我应该注意哪种模式?
  3. 我的 ModelBinder 实现错了吗?如果是这样,我需要学习什么来解决它?
  4. 在另一个与该用户类似的问题中,Mark Seemann推荐了一个抽象工厂——这有什么关系?

我想就是这样 - 我真的想不出任何其他问题来帮助我理解,但非常感谢任何额外的信息。

我知道 DI 可能不是所有问题的答案,而且我在实现它的方式上可能有些过火,但是,它似乎以我期望的方式工作,与单元测试一起工作,而不是什么。

我不是在寻找代码来修复我的示例实现——我在寻找学习,寻找解释来修复我有缺陷的理解。

我希望 stackoverflow.com 能够保存草稿问题。我也希望回答这个问题的人在回答这个问题时获得适当的声誉,因为我认为我要求很多。提前致谢。

0 投票
1 回答
1851 浏览

.net - Unity 'GetAllInstances' 不返回任何内容

我正在使用统一来管理我的应用服务器上的服务,但由于某种原因,我无法让方法“GetAllInstances”工作。奇怪的是,相同类型的“GetInstance”似乎工作正常!

这是配置:

这个想法是,当服务器启动时,我需要能够获取所有已配置的 IService 实例来初始化它们。

正如我所说,单曲有效,但 get all 没有任何回报。即使我从配置中删除了 IAtomCommandService 映射并且只拥有 IService 它仍然无法正常工作。关于我在哪里出错的任何想法?

0 投票
1 回答
1760 浏览

exception - SolrNet - 字典中不存在给定的键

我将 SolrNet 与 vb.net 2.0 一起使用,但似乎无法实例化 solr。

Dim solr As IsolrOperations(Of PMWProperty) = ServiceLocator.Current.GetInstance(Of PMWProperty)()

抛出异常:

[KeyNotFoundException: 给定的键不在字典中。] System.ThrowHelper.ThrowKeyNotFoundException() +28 System.Collections.Generic.Dictionary`2.get_Item(TKey key) +7456108 SolrNet.Utils.Container.DoGetInstance(Type serviceType , String key) +22 Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance(Type serviceType, String key) +47

[ActivationException:尝试获取 PMWProperty 类型的实例时发生激活错误,键“”] Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance(Type serviceType, String key) +104 Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance() +5

我有一个 PMWProperty 类,其中只有几个与我的 solr 模式匹配的字段。我可以很好地通过 solr url 运行查询(localhost:8983/solr),但不能让它在我的代码中工作。

它在看什么键?异常好像说key是"",但是应该是什么?为什么我需要钥匙?

0 投票
2 回答
4723 浏览

performance - @EJB 注入与查找 - 性能问题

我有一个与使用 @EJB 注释时可能的性能问题有关的问题。想象以下场景

有一个 bean 与其他 bean 有许多依赖关系。根据 EJB 规范,如果我想将 MyBean1Remote 注入到其他某个 bean,容器必须从其池中获取所有必需的依赖项,然后将其注入 MyBean1Remote,然后注入对 MyBean1Remote 存根的引用。

因此在以下场景中容器需要保留 20 个 ejb(myBean1 及其 19 个依赖项)

假设在大多数情况下,我们将为 myBean1 的每个业务方法仅使用一个依赖项。因此,每次我们想要注入该 bean 时,我们都会强制容器保留许多不必要的 EJB。让我们还假设我们正在对远程 bean 进行操作,因此容器可能还需要在注入依赖 bean 之前执行一些负载平衡算法。

问题:

  1. 在集群环境中运行时,这不会导致不必要的资源预留和更多的性能问题吗?

  2. 也许好的旧 ServiceLocator 可能是更好的解决方案,因为使用这种方法,我们会在真正需要时要求特定的 EJB?