问题标签 [common-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.
c# - IServiceLocator.GetInstance(Type) 的意图与 IServiceProvider.GetService(Type) 的意图有何不同?
IServiceProvider.GetService(Type serviceType)
方法签名和的意图有区别IServiceLocator.GetInstance(Type serviceType)
吗?如果有,有什么区别?
我一直将它们视为等效的,但为了保持一致性,我选择使用单一方法。这似乎是处理这两个接口的一个足够好的解决方案,但我真的很想知道它们的实际用途是什么,以便我可以确定我在正确的地方使用了正确的接口。 如果他们的意图实际上是相同的,那么有任何理由为同一目的使用多组语义吗?(我知道签名是在 开始时推荐的,GetInstance
Microsoft.Practices.ServiceLocation
但这似乎并不是引入重复的合理理由)。
为什么我很困惑
下面列出了我在试图找到这个问题的答案时发现的有时相互矛盾的事实,以及我对它的解释。我将这些包括在内,以便可以在有关该主题的所有已知信息的背景下解决我的问题。
MSDN 文档
IServiceProvider
说该方法GetService(Type serviceType)
应该返回serviceType 类型的服务对象。
-或 -如果没有serviceType类型的服务对象,则为
null。MSDN 文档
IServiceLocator
缺少方法文档,但 VS 对象浏览器中的摘要说GetInstance(Type serviceType)
该方法返回“请求的服务实例”。但是,文档中还有一个异常条目IServiceLocator
,指出ActivationException
如果解析服务实例时出现错误,则应抛出一个异常条目。ActivationException
位于Microsoft.Practices.ServiceLocation
引入多年后IServiceProvider
引入的命名空间中。因此,可以理解的IServiceProvider
是 不指异常。话虽如此,IServiceLocator
接口的文档没有说明null
如果没有找到结果就返回。也不清楚是否缺少所请求的服务类型的实现应构成例外。缺少服务类型的实现是否会导致
ActivationException
inIServiceLocator
实现? 看起来不像。的实现模板IServiceLocator
忽略任何非空后置条件的概念。的实现模板
IServiceLocator
也被IServiceProvider.GetService(Type)
视为IServiceLocator.GetInstance()
. 这是否算作违反 Liskov(由于在未在基类型上声明的子类型中抛出异常),或者,这实际上需要实现差异而不是接口方法签名上声明的异常?我的意思是:我们确定ServiceLocatorImplBase
实现模板IServiceLocator
正确实现了这两个接口吗?IServiceProvider
将调用包装GetInstance
在 try 块中并null
在捕获到异常时返回 是否会更好地表示接口的意图?附录:与此相关的另一个问题是 to 的对应
IServiceLocator.GetAllInstances(Type)
关系IServiceLocator.GetInstance(Type)
。具体来说,对于任何类型 T,其实现是否应该IServiceLocator.GetAllInstances(typeof(T))
返回与 ? 相同的结果IServiceLocator.GetInstance(typeof(IEnumerable<>).MakeGenericType(typeof(T))
? (很容易看出这与IServiceProvider
对应关系有什么关系,但我认为最好保持问题简单,只比较这种情况下同一接口的两种方法。)
.net - 是否有注册 IoC 组件的通用接口?(想想 CommonServiceLocator 但用于注册)
Common Service Locator是一个很好的编程接口,用于检索 IoC 容器中的注册实例。
我已经构建了一个基于约定的工具,可以向 IoC 容器注册实例,并且我希望它与容器无关。
是否有任何项目试图创建一种向 IoC 容器注册实例的标准方式,以便每个 IoC 提供者都可以简单地开发一个适配器?
如果没有,我可能会得到一个代表。
visual-studio - 包在 NuGet 管理器的更新中列出,无法删除
这是我很长一段时间以来一直遇到的问题,但是因为我们正在关闭这个项目,所以我想我终于可以解决它了。当我检查我们的 NuGet 包的更新时,列表总是显示这个(+任何实际可用的更新):
当我单击更新时,会显示以下屏幕:
我无法选择任何复选框,如您所见,它们默认未选中,这意味着我没有在我们的项目中安装此包。无论我单击“确定”还是“取消”,它总是会回到第一个屏幕截图。正如您在屏幕截图 3 中看到的,该软件包甚至没有列在已安装列表中:
它也不在任何 packages.config 文件中。当我编写 Uninstall-Package CommonServiceLocator 时,我得到了这个:
PM> Uninstall-Package CommonServiceLocator
Uninstall-Package : Unable to find 'CommonServiceLocator' in 'ManagementSystem' and found multiple versions of 'CommonServiceLocator' installed. Please specify a version.
At line:1 char:18
+ Uninstall-Package <<<< CommonServiceLocator
+ CategoryInfo : NotSpecified: (:) [Uninstall-Package], InvalidOperationException
+ FullyQualifiedErrorId : NuGetCmdletUnhandledException,NuGet.PowerShell.Commands.UninstallPackageCommand
我无法指定版本,因为没有安装。我什至尝试手动将包添加到我的 packages.config 文件中,然后通过已安装列表将其卸载。然后我尝试在 NuGet 管理器中安装和卸载它。还是一样。你曾经发生过这些事情吗?你是怎么解决的(除了重新创建整个项目)?谢谢!
mvvm-light - 为什么我的项目无法引用 System.ComponentModel 程序集?
我的项目设置为 .NET Framework 4.5。尝试在我的 WPF 项目中使用 SimpleIOC(来自 MVVM Light)时出现以下错误:
Error 3 Reference required to assembly 'System.ComponentModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' containing the implemented interface 'System.IServiceProvider'. Add one to your project.
我不知道为什么它给了我这个错误。据我了解,这是一个 mscorlib 类,所以我不确定它是从哪里获取 System.ComponentModel 的。
我可以Dim test As IServiceProvider
在没有编译器抱怨的情况下编写。是否存在某种版本问题?
c# - ServiceLocator GetAllInstances 不包含指定合约名称的实例
假设我有一个界面ITest
:
再加上两个实现:
然后,我尝试检索以下所有实例ITest
:
事实证明,只能Test2
返回实例。由于合同名称,它只是找不到Test1
.
我使用 MEF + ServiceLocator + MefAdapter来运行所有这些东西。从我的调试来看,MefAdapter 覆盖了 中的方法DoGetAllInstances(Type serviceType)
,ServiceLocatorImplBase
但它只提供了一个参数serviceType
。
ITest
那么,无论实现是否导出了联系人姓名,如何使用 ServiceLocator获取所有实例?
xamarin - MvvmLight 的 SimpleIoc 在 Xamarin Forms 1.3 Android 和 iOS 应用程序中中断,但在 Windows Phone 中没有
我正在开发一个 Xamarin Forms 应用程序,Windows Phone 的构建和运行一切顺利。但是,当我尝试运行 Android 版本时,它构建正常然后失败,并且在调用 ServiceLocator 以解析 ViewModelLocator 中的 ViewModel 时出现异常。
ViewModelLocator 中的行中断
和
并将鼠标悬停在“GetInstance”节目上
我的 ViewModel 唯一的构造函数看起来像
所有依赖项都在此之前注册,ViewModelLocator
例如
以及 MainActivity.cs (Android) 和 AppDelegate(iOS) 中的一些平台特定的,例如
我不明白的是它在 Windows Phone 中运行良好吗?Android有什么不同?有人在 Xamarin 1.3+ 中使用过 SimpleIoc 吗?
我应该使用工厂来创建他的 ViewModel 吗?
任何帮助都会非常好,非常感谢。我正在使用 MVVMLight (5.1.0.1) 和 Xamarin (1.3.3) 的所有最新版本。
c# - Reference CommonServiceLocator Nuget on .NET Standard 1.4
Is there an easy way to install the CommonServiceLocator nuget package to a .NET Standard 1.4 project in visual studio 2017?
Installing the nuget package fails with:
Package CommonServiceLocator 1.3.0 is not compatible with netstandard1.4 (.NETStandard,Version=v1.4). Package CommonServiceLocator 1.3.0 supports: portable-net40+sl5+win8+wp8+wpa81 (.NETPortable,Version=v0.0,Profile=Profile328) One or more packages are incompatible with .NETStandard,Version=v1.4.
c# - Asp.net 核心:注入事件处理程序?
我有一个 asp.net 核心应用程序,这是我的设置:
不幸的是,我无法控制那个调度程序中间件,所以我只有 AddScheduler 和 lambda。
到目前为止,我唯一能想到的是:
但这只是通过闭包潜入一种“ServiceLocator”的另一种方式。
有没有更好的想法?理想情况下应该如何处理?
(这不是我如何从 Startup.cs 中写入日志的重复,因为这是关于注入到事件处理程序中,而不是在启动对象中。)
inversion-of-control - 尝试获取 IBackupTableStorageService 类型的实例时发生激活错误,键 "" StructureMap 库
我正面临映射问题。我的解决方案如下。
我有两个项目
在第一个项目中,我有一个使用 Queue 触发的天蓝色函数,并调用我的 concreate 类中存在的函数 BeginBackup(CancellationToken token, DateTime.Now())。
我从 Azure 函数调用我的函数,如下所示。
我的 DependencyContext.cs 类在下面。
我有另一个我创建的 Registery 类,它具有我的接口与我的具体类的映射。
Registery.cs 文件如下。
同样,我有我的接口并尊重创建类,该类定义了我的方法BeginBackup(CancellationToken token, DateTime.Now());
我在 DependencyContext.cs 类的 DoGetInstance 方法中遇到异常。
我是 IoC 和依赖注入的新手,请让我知道我做错了什么,如果需要让问题更清楚,请告诉我。
.net - MvvmLight 与 WindsorCastle:冲突 Microsoft.Practices.ServiceLocation
我安装在我的 .NET 项目中:
- MvvmLight v5.4.1.1
- 城堡.温莎 v5.0.0
- CommonServiceLocator v2.0.2
- CommonServiceLocator.WindsorAdapter.Unofficial v3.3.0
然后我像这样初始化我的容器
这给出了这个错误:
'ServiceLocatorImplBase' 类型是在未引用的程序集中定义的。您必须添加对程序集“Microsoft.Practices.ServiceLocation, Version=1.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”的引用。
基本上,MvvmLight v5.4.1.1 期望 CommonServiceLocator v2.0.2,CommonServiceLocator.WindsorAdapter.Unofficial 期望 CommonServiceLocator v1.3.0,CommonServiceLocator.WindsorAdapter 期望 CommonServiceLocator v1.0.0
一种解决方案是将 CommonServiceLocator 降级到 v1.3.0 并且它可以工作,但随后 MvvmLight 也会降级到 v5.3.0
这样做的正确方法是什么?如何让 MvvmLight 和温莎城堡一起工作?