- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
方法签名的意图是否存在差异IServiceProvider.GetService(Type serviceType)
和 IServiceLocator.GetInstance(Type serviceType)
?如果有,区别是什么?
我一直将它们视为等同的,但为了保持一致性,我选择使用单一方法。对于处理这两个接口(interface)来说,这似乎是一个足够好的解决方案,但我真的很想知道它们的实际用途是怎样的,这样我就可以确定我在正确的地方使用了正确的接口(interface)。 如果他们的意图实际上是相同的,那么是否有任何理由为了同一目的而使用多组语义?(我理解 the GetInstance
signature was recommended during the inception of Microsoft.Practices.ServiceLocation
,但这看起来不像是一个声音引入重复的原因)。
下面列出了我在试图找到这个问题的答案时发现的有时相互矛盾的事实,以及我对这些事实的解释。我将这些包括在内,以便我的问题可以在关于该主题的所有已知信息的上下文中得到解决。
MSDN documentation for IServiceProvider
说GetService(Type serviceType)
方法应该返回
A service object of type serviceType.
-or-
null if there is no service object of type serviceType.
MSDN documentation for IServiceLocator
缺少方法文档,但 VS 对象浏览器中的摘要 GetInstance(Type serviceType)
表示该方法返回“请求的服务实例”。但是,文档中也有异常条目IServiceLocator
那说 ActivationException
如果解析服务实例时出现错误,则应抛出该异常。
ActivationException
位于 Microsoft.Practices.ServiceLocation
在 IServiceProvider
之后引入的 namespace 被介绍。所以,IServiceProvider
是可以理解的不指异常。也就是说,IServiceLocator
接口(interface)的文档没有提到返回 null
如果没有找到结果。还不清楚所请求服务类型的实现缺失是否应该构成异常。
如果缺少服务类型的实现会导致 ActivationException
在IServiceLocator
实现? 看起来不像。 implementation template对于 IServiceLocator
忽略任何非空后置条件的概念。
implementation template对于 IServiceLocator
也对待IServiceProvider.GetService(Type)
作为 IServiceLocator.GetInstance()
的替代语法.这是否算作违反 Liskov(由于在未在基类型上声明的子类型中抛出异常),或者,这实际上需要在实现上有所不同,而不是在接口(interface)的方法签名上声明异常吗?我的意思是:我们确定 ServiceLocatorImplBase
IServiceLocator
的实现模板是否正确实现了这两个接口(interface)? 它是否能更好地表示接口(interface)对 IServiceProvider
的意图?包装 GetInstance
调用 try block ,并返回 null
什么时候捕获到异常?
附录: 与此相关的另一个问题是 IServiceLocator.GetAllInstances(Type)
的对应关系。至 IServiceLocator.GetInstance(Type)
.具体来说,对于任何类型 T,都应该实现 IServiceLocator.GetAllInstances(typeof(T))
返回与 IServiceLocator.GetInstance(typeof(IEnumerable<>).MakeGenericType(typeof(T))
相同的结果?(很容易看出这与 IServiceProvider
对应关系有何关系,但我认为最好让问题保持简单,并且只比较这种情况下同一接口(interface)的两种方法。)
最佳答案
正如您已经注意到的,IServiceProvider.GetService
和 IServiceLocator.GetInstance
之间的区别在于任何 IServiceProvider.GetService
实现都应该 当服务未注册或由于任何原因无法解析时返回 null
,而另一方面,IServiceLocator.GetInstance
实现应该在这种情况下抛出异常(并且永远不会返回 null
)。
但请注意我使用了“应该”这个词。 Common Service Locator project 随附的所有 CSL 适配器(用于 Windsor、Spring、Unity 和 StructureMap 等) (它拥有 IServiceLocator
接口(interface))不遵守 IServiceProvider
接口(interface),当您调用它们的 IServiceProvider.GetService
方法时,它们会抛出异常。
通过破坏契约,CSL 的设计者设法使 IServiceProvider
接口(interface)完全无用。您现在不能再依赖它返回 null,这很糟糕。特别糟糕。我所知道的唯一遵守契约(Contract)的 CSL 适配器是 Simple Injector adapter ,但是由于所有其他实现都被破坏了,即使这个正确实现的适配器此时也没有用,因为您无法安全地交换实现。
Does this count as a violation of Liskov
当然。它们破坏了接口(interface)契约,并且实现不能相互替代。
设计者知道这一点,从Glenn Block可以看出对 this thread 的评论:
Sounds like we might have messed up here. The idea of throwing an exception was an explicit design goal that we all agreed on. Making it implement IServiceProvider was more of a convenience, but sounds like this was overlooked.
该缺陷从未修复,因为 CSL 从未更新过。
关于c# - IServiceLocator.GetInstance(Type) 的意图与 IServiceProvider.GetService(Type) 的意图有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14864108/
作为后续问题:Laravel Redirect::intended() conditional fallbacks 我遇到了一个问题,在设置了预期的 URL session 后,即使用户决定不登录而是
我面临一个问题,即与任何意图不匹配的单词,它会假设它属于标记最多的话语的意图。 示例:如果 意图 A 由动物等话语组成 意图 B 包含“水果”等话语 意图 C 由诸如昆虫之类的话语组成 意图 D 由诸
拥有什么实际区别 subroutine fillName(person) type(PersonType), intent(inout) :: person person%name = "
我想知道 Dialogflow 中是否有任何商定的意图、事件和上下文的命名约定。 如果没有,那么如果您分享您自己的命名约定,我将不胜感激! 最佳答案 我发现“只要别人容易理解就行”这句话有点矛盾。如果
我正在尝试了解使用队列的用例。 我的理解:队列意味着一对一。唯一的用例(如果不是罕见的话,很少)是:消息仅供一次使用。 但即使在这些情况下,我也可能想使用主题(只是为了将来安全)。唯一需要额外注意的是
我的 Xcode 是 v10,我正在为 SiriKit 开发一个针对 iOS 12 的自定义 intent。 在 Xcode 10 中,自定义意图是在 .intentdefinition 文件中设计的
我有一个设置了 .intentdefinition 文件的 WidgetKit ,我可以在运行我的 WidgetKit 时从我的枚举中进行选择,但我不确定如何在代码中使用这些信息。 我希望能够根据用户
我需要为意图过滤器注册(在运行时)自定义 BroadcastReceiver 可以在 list 中描述为 并在用户通过按应用程序中的某个按钮退出应用程序时取消注册接收
根据 Fortran 标准: The INTENT (OUT) attribute for a nonpointer dummy argument specifies that the dummy a
我正在使用 Twitter Web Intents 来检查是否有人关注我。现在的问题是;我只在事件对象中获取我自己的屏幕名作为回调。 twttr.events.bind('follow', funct
编辑 很抱歉大家,这只是由于意图名称后面缺少逗号。非常抱歉x: 我最近使用 Microsoft Bot Framework (botbuilder v3.14.0)、Node.js (v8.9.4)
我正在开发的产品: RequeSTLy - Chrome 和 Firefox 扩展设置重定向、修改 header 、切换主机、插入用户脚本 ( https://www.requestly.in/ )
有什么方法可以有目的地合并对话框,这样我就不需要多余的代码片段? bot.dialog('whats-your-name', require('./dialogs/whats-your-name')
我是 Dialogflow 的新手,虽然它很容易理解,但我无法使用自定义事件触发 Intent。 我必须实现的任务是,当在后端 Node.js Webhook 中检测到警报时(例如:老板想要做某事),
在 Microsoft Bot Framework 中,我已经开始对话并运行一些意图,假设“登录”,但是当我向用户询问用户名或密码时,他可能会说“取消该”或“取消登录”,我如何获得此意图:“取消”以及
我使用 LUIS 框架构建了一个运行良好的机器人。在研究过程中遇到了以下几点 与 LUIS 意图连接后;机器人无法检查正则表达式意图喜欢 对于我正在尝试设置的对话框.matches('^helpdes
我想知道 URL 是发布到 facebook 的链接。在 Twitter 上,我可以使用“http://twitter.com/intent/tweet?text=”来发推文。虽然我试图寻找一个,但我
通读,http://www.w3schools.com/angular/angular_directives.asp我遇到了一个在评论中调用指令的例子,具体来说: 您可以在 http://www.w
我在 Stack Overflow 上的许多帖子中读到,可分配数组在传递到虚拟参数为 intent(out) 的子例程中时会被释放。 如果我考虑以下代码: program main real, di
API.ai 的预构建包可让您轻松获得长长的意图列表。目前,我正在尝试利用他们的 smalltalk 包,该包有大约 100 个意图,并对每个意图做出响应。 我正在使用api-ai-recognize
我是一名优秀的程序员,十分优秀!