问题标签 [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 投票
1 回答
625 浏览

asp.net-mvc - ServiceLocator 的 ASP.NET MVC 3 RTM 方式

我对 IServiceLocator、IMvcServiceLocator、IDependencyResolver 等有点困惑……

定位服务的 ASP.NET MVC 3 RTM 方式是什么?

我只需要访问类似的东西

从任何地方(包括另一个程序集)。

编辑:示例

我的网络应用程序有一种模块化架构。主题是模块的一个方面。每个主题都是一个单独的类库。不可能知道一个主题需要什么服务。例如,某些视图可能会显示标签云小部件,而该小部件需要 TagRepository 的实例。

目前我正在将 Windsor 用于 IoC,我可以为模块公开该容器。但我真的不想让每个模块都依赖于 Windsor。我想知道标准 Mvc 库中是否有解决方案,因为模块无论如何都需要引用它。

0 投票
2 回答
979 浏览

c++ - 静态成员类与普通的类 c 接口

嘿。
在阅读了这里关于服务定位器模式的信息后,我开始思考只有静态成员的类是否真的是要走的路,或者普通的类 c 交互是否更合适。class我看到人们在他们甚至不需要它的时候一直在扔关键字。
从链接页面获取静态成员类的示例:

这也是一种方法:

Locator::GetAudio()这两个示例都可以用和以完全相同的方式调用Locator::Register(...)。以上哪一项优于另一项?他们是一样的吗?有没有更好的方法来实现这一点?还是只是个人喜好?谢谢你的帮助。:)

0 投票
11 回答
42144 浏览

c# - 依赖注入与服务位置

我目前正在权衡DI和SL之间的优缺点。但是,我发现自己处于以下 catch 22 中,这意味着我应该对所有事情都使用 SL,并且只将 IoC 容器注入每个类。

DI 第 22 条:

一些依赖项,例如 Log4Net,根本不适合 DI。我将这些元依赖称为元依赖,并认为它们对调用代码应该是不透明的。我的理由是,如果一个简单的类“D”最初是在没有日志记录的情况下实现的,然后增长到需要日志记录,那么依赖类“A”、“B”和“C”现在必须以某种方式获得这种依赖关系并将其从“A”到“D”(假设“A”组成“B”,“B”组成“C”,依此类推)。我们现在对代码进行了重大更改,只是因为我们需要登录一个类。

因此,我们需要一种不透明的机制来获得元依赖。我想到了两个:Singleton 和 SL。前者有已知的限制,主要是关于严格的作用域能力:单例最多将使用存储在应用程序范围内的抽象工厂(即在静态变量中)。这允许一些灵活性,但并不完美。

更好的解决方案是将 IoC 容器注入到此类类中,然后在该类中使用 SL 来解决容器中的这些元依赖项。

因此捕获 22:因为该类现在被注入一个 IoC 容器,那么为什么不使用它来解决所有其他依赖项呢?

我将非常感谢您的想法:)

0 投票
3 回答
919 浏览

c# - C# 中服务定位器模式的相关测试

我在我的应用程序中使用了这个服务定位器模式并作为单例实现:

服务定位器模式

现在我要测试它。到目前为止,我已经编写了一个测试来验证我的班级是单例。我也写了这个测试:

但我不太喜欢最后一次测试,因为我永远不会使用 IRandomService。所以我正在寻找一种更好的方法来测试GetService<T>抛出异常。我也想知道我是否可以为这门课编写任何其他相关测试。

我正在使用最新版本的 NUnit。

干杯

0 投票
1 回答
524 浏览

gwt - 具有多模块 maven 项目的 GWT ServiceLocator

我有一个多模块 GWT 项目,我想使用 ServiceLocators。我有 3 个模块:

  • “客户端”依赖于共享
  • “共享”
  • “服务器”依赖于共享

我这样写了ServiceLocator:

并将此类放在“共享”模块中,因为 ServiceLocator 具有包 com.google.gwt.requestfactory.shared。但是,当我编译时会抛出一个错误,因为 TreeService 是在“服务器”模块中实现的,因为我需要它从服务器返回 bean 并与 Spring 交互等。

我应该在哪个模块中实现 TreeServiceLocator?此外,如果我尝试从“共享”模块中包含“服务器”,maven 将引发循环依赖错误。

谢谢!

0 投票
4 回答
2076 浏览

c# - 如果无法进行依赖注入怎么办?

经过多次踢腿和尖叫后,我开始接受 DI,尽管随着依赖项的增长,SL 看起来会变得更加干净。

然而,IMO 在 DI 方面仍有一个重要的亮点:

当您无法控制对象的实例化时,DI 是不可能的。在 ASP.NET 世界中,示例包括:HttpModule、HttpHandler、Page 等。

在上述场景中,我们将求助于静态服务位置来解决依赖关系,通常是 via HttpContext.Current,它总是从当前线程推断范围。因此,如果我们要在这里使用静态 SL,那么为什么不在其他地方也使用它呢?

答案是否很简单:咬紧牙关,必要时使用 SL(如上),但尝试支持 DI?如果是这样:是否只使用一次静态 SL 可能会破坏整个应用程序的一致性?从本质上消除 DI 在其他地方的辛勤工作?

0 投票
2 回答
1982 浏览

asp.net-mvc - 在类库和 MVC DependencyResolver 中使用 ServiceLocator

我真的进入了 DI/IoC 的事情——它让一些事情变得容易多了。但是,我有一些继承的类实现了一个具有所需的无参数构造函数的类,因此我使用服务定位器来获得我想要的:

完美运行。但是,由于我也在使用 MVC3 DependencyResolver,我发现自己别无他法,只能这样做:

DependencyResolver 在 MVC 应用程序中使用,ServiceLocator 在各种类库中使用。

这是执行此操作的理想方法吗?我错过了什么吗?

更新

在上面的示例中,该类是一个自定义的 asp.net 成员资格提供程序。asp.net 成员提供程序工厂要求我的自定义提供程序具有无参数构造函数,这迫使我使用服务定位器来注入它在内部使用的存储库。

0 投票
2 回答
2509 浏览

c# - 将参数传递给 IServiceLocator

我有一个 ViewModel 类,我想通过统一 ServiceLocator 解决它,但我的 viewModel 需要构造函数的参数。参数的类型是我的应用程序中的实体之一(客户对象),而不是某些服务实现。我知道针对 Unitycontainer 本身的编码我可以传递这样的参数:

但如果我没有直接访问容器的权限,我需要像这样通过 ServiceLocator:

但是,使用第二种方法我无法将任何参数传递给 ServiceLocator。有什么办法可以做到这一点?从 ServiceLocator 获取 Container 的实例然后使用它是“错误的”吗?

0 投票
1 回答
974 浏览

dependency-injection - 如何使用依赖注入而不是服务定位器

我听说人们说你不应该使用服务定位器来进行依赖注入。那么如何在不依赖服务定位器的情况下注入依赖项呢?我想尝试 IoC 容器,但不想陷入反模式。

您是否应该将所有内容都设置好,以便所有类始终具有到最深类的依赖链?(如果我/那有道理的话)

让你的所有代码都依赖于所选的 IoC 容器是不对的,是吗?

那么你在哪里“使用”你的容器(rexolving)?以及如何让它解决所有问题,就像你的代码一样深入?它是通过使用贯穿每一层直到顶层的接口以正确方式设计一切的一部分吗?

或者我只是错过了一点?

让我提醒你,我只是不想陷入反模式,需要一些提示/提醒。

0 投票
2 回答
2254 浏览

c# - 服务定位器混淆

我只是在编写一个实现 ServiceLocator 模式的类。

现在我有几个问题:

1.)我应该从哪里调用这个类?app.xaml.cs 做 wpf 的东西?

2.) 我应该注册服务吗,如果是,我应该在哪里注册?

3.) 当我对服务“ICustomerService”进行延迟初始化时,为什么要为它创建一个 Register(T 服务) 方法?那是双重工作。

4.) 我应该去找服务定位器吗?

更新

目前我觉得我必须为我的个人目的强奸一个 DI 工具 =>

App.xaml.cs => 在这里我创建 MainWindow 并将其 datacontext 设置为 MainViewModel.cs

MainViewModel.cs => 在这里,我预加载/设置了某些 Controller/ViewModel 所需的数据,例如 LessonPlannerDailyViewModel 或 LessonPlannerWeeklyViewModel 等...

在另一个 ViewModel 上是LessonPlannerDailyViewModel.cs => 在这里我创建了一个 PeriodViewModel 对象的可绑定集合,这些对象在它们的构造函数中接受了一些服务。在以下代码之后的下一段中,请参阅由 ONE PeriodViewModel 创建的 DocumentListViewModel.cs,它再次接受服务 - 与我在 MainViewModel 中创建的相同...... -

PeriodViewModel.cs => 我的 DataGrid 中的每个 DataRow 都有一个 Period 并且 Period 有一个特定的单元格数据模板化到 DocumentListViewModel - Period 1 有 N Documents 是关系仅供参考......所以 PeriodViewModel 创建一个 DocumentListViewModel。

DocumentListViewModel.cs => 在这里我设置了添加/删除/打开文档的命令,这可以通过 documentService/documentRepository 完成

总结问题:您是否看到从顶部级联服务的对象链:

MainViewodel -> LessonPlannerDailyViewModel -> PeriodViewModel -> DocumentListViewModel

我需要级联它们,因为如果我不使用静态服务定位器,我只能确保在级联服务时拥有一个服务实例......

这里的 DI 工具如何帮助我按照 MVVM 模式具体执行 wpf 应用程序?