- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
具体问题:
如何在我的代码库中对DI配置进行单元测试,以确保在对自动绑定检测进行一些更改后,所有连接仍能正常进行。
我一直在为使用Ninject进行Ioc / DI的小型代码库(也许约10页?和20-30个服务/控制器)做出贡献。
我发现在Ninject内核中它被配置为BindDefaultInterface
。这意味着,如果您要求它提供IFoo,它将去寻找Foo类。
但这是基于字符串模式,而不是C#继承。这意味着MyFoo : IFoo
将不会绑定,您还可能获得其他奇怪的“巧合”绑定,也许吗?
到目前为止,这一切都可行,因为每个人碰巧都调用了自己的WhateverService接口IWhateverService
。
但这对我来说似乎非常脆弱且不直观。当我想将我的实时FilePathProvider : IFilePathProvider
重命名为AppSettingsBasedFilePathProvider
(而不是Test中使用的RootFolderFilePathProvider
或NCrunchFilePathProvider
)时,它特别断了,它告诉你它做了什么: )
有两种替代配置:BindToDefaultInterfaces
(请注意复数形式)会将MyOtherBar
绑定到IMyOtherBar
,IOtherBar
和IBar
(我认为)
如果每个类都完全实现1个接口,则BindToSingleInterface
有效。BindToAllInterfaces
确实听起来像。
我想更改为那些,但是我担心会引入一些难以理解的错误,从而某些地方的类以应有的方式停止绑定,但是我没有注意到。
有没有办法以合理的安全性来测试此更改/进行更改(无论如何,不仅仅是“做到并希望”!),而不仅仅是尝试锻炼每个可能的组件。
最佳答案
所以,我设法解决了这个问题...
我的解决方案并非没有缺点,但从根本上实现了我想要的安全性。
摘要
大致来说有两个方面:
以编程方式测试DI内核知道的每个绑定都可以干净地解析。
以编程方式测试代码库中使用的每个相关接口都可以完全解析。
两者都采用大致相同的路径:
重构您的DI配置代码,以便它的定义应用程序内容绑定的核心部分可以与其余启动代码隔离地运行。
在测试开始时,请调用上面的DI配置代码,以便您拥有站点使用的内核对象的副本,可以测试其绑定
执行一定数量的反射,以生成内核应能够提供的相关Type
对象的列表。
(可选)过滤该列表,以忽略一些您不需要测试的类和接口(例如,您的代码无需担心内核是否知道如何自举,因此它可以忽略任何绑定)它在属于您的DI框架的名称空间中。)。
然后,循环遍历剩下的接口类型对象,并确保kernel.Get(interfaceType)
的每个对象都没有异常运行。
继续阅读以获取更多Gory详细信息...
验证所有定义的内核绑定
这将是特定于所讨论的DI框架的,但是对于Ninject
来说,这是一件很麻烦的事情...
如果Ninject
内核具有内置的方法来公开其绑定集合,那就更好了,但是事实并非如此。但是bindings集合是私有可用的,因此,如果您执行正确的Reflection咒语,就可以掌握它们。然后,您必须执行更多的反射操作才能将其绑定对象转换为{InterfaceType : ConcreteType}
对。
我将发布关于如何分别从Ninject
提取这些对象的细节,因为这与通常如何为DI config设置测试的问题正交。 {#占位符以链接到该#}
其他DI框架可以通过更公开地提供这些集合(甚至直接提供某种Validate()
方法)来简化此过程。
一旦有了内核认为可以绑定的接口列表,就可以遍历它们并测试解决每个接口。
具体细节因语言和测试框架而异,但我使用C#
和FluentAssertions
,因此我分配了Action resolutionAction = (() => testKernel.Get(interfaceType))
并声明了resolutionAction.ShouldNotThrow()
或类似的内容。
验证代码库中的所有相关接口
上半年一切都很好,但是它告诉您的是,您直接提取的绑定是定义明确的。它不会告诉您是否完全缺少任何绑定。
您可以通过收集代码库中所有有趣的程序集来解决这种情况:
Assembly.GetAssembly(typeof(Main.SampleClassFromMainAssembly))
Assembly.GetAssembly(typeof(Repos.SampleRepoClass))
Assembly.GetAssembly(typeof(Web.SampleController))
Assembly.GetAssembly(typeof(Other.SampleClassFromAnotherSeparateAssemblyInUse))
Assembly
反映其类,以查找其公开的公共接口,并确保每个接口都可以被内核解析。
关于c# - 安全地对IoC/DI配置进行广泛的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47835373/
我只是不喜欢 Logback 的 XML 或 Groovy 配置,而更喜欢用 Java 进行配置(这也是因为我将在初始化后的不同时间在运行时更改配置)。 似乎对 Logback 进行 Java 配置的
我的 sphinx 配置是: ================================ config/sphinx.yml development: bin_path: "/usr/loc
我们计划在生产服务器中部署我们的系统。我有兴趣了解更多有关优化网站性能的信息。 Sitecore 有哪些优化建议? (缓存,网络配置中的其他设置) 我们可以在 IIS 中做哪些优化? 找不到关于这些主
我有一个 Django 应用程序,可以处理网站的两个(或更多)部分,例如网站的“admin”和“api”部分。我还为网站的其余部分提供了普通的 html 页面,其中不需要 Django。 例如,我希望
我刚刚开始研究Docker。我有一个 Node 应用程序,可以调整大小和图像,然后在完成后向 aws 发送 SQS 消息。我已成功创建应用程序的 docker 镜像,并从本地计算机复制它,但遇到了无法
如何配置 checkstyle(在 Ant nt Maven 中)任务?我尝试了一点,但没有正确收到报告。这是我的 Ant 脚本。
我正在使用 Quartz 和 Spring 框架重写一个遗留项目。原始配置是 XML 格式,现在我将其转换为 Java Config。 xml 配置使用 jobDetail 设置触发器 bean 的作
tl;rd: 使用主键对数据库进行分区 索引大小问题。 数据库大小每天增长约 1-3 GB 突袭设置。 您有使用 Hypertable 的经验吗? 长版: 我刚刚建立/购买了一个家庭服务器: 至强 E
在安装 gcp 应用程序后,我们尝试使用 GCP 的图形 api 配置 Azure Active Directory saml 配置。我们正在遵循相同的 AWS graph api saml 设置 U
我刚刚了解了 spring security 并想使用 java hibernate 配置连接到数据库,但我发现的示例或教程很少。我通过使用 xml 配置找到了更多。我在这里使用 Spring 4.0
我们最近切换到 Java 8 以使用 java.time API(LocalDate、LocalDateTime,...)。因此,我们将 Hibernate 依赖项更新到版本 4.3.10。我们编写了
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是《quarkus实战》系列的第六篇,咱
我是 NGINX 的新手,我正在尝试对我们的 ERP 网络服务器进行负载平衡。我有 3 个网络服务器在由 websphere 提供支持的端口 80 上运行,这对我来说是一个黑盒子: * web01.e
我们想使用 gerrit 进行代码审查,但我们在 webview 中缺少一些设置。 是否可以禁止提交者审查/验证他们自己的 提交? 是否有可能两个审稿人给 +1 一个累积它 到+2,以便可以提交? 谢
配置根据运行模式应用于 AEM 实例。在多个运行模式和多个配置的情况下,AEM 如何确定要选择的配置文件?假设以下配置在 AEM 项目中可用, /apps /myproject - con
我正在使用 Neo4j 服务器。我遇到了负载相对较低的问题。但是,响应时间相当长。我认为为请求提供服务的线程数太少了。有没有办法调整为 HTTP 请求提供服务的线程池的大小。那可能吗? 最佳答案 线程
我在/etc/default/celeryd 中有以下配置 CELERYD_NODES = "worker1 worker2 worker3" CELERYD_CHDIR = "path to pro
Plone 在其页面中显示来 self 的母语(巴西葡萄牙语)的特殊字符。但是,当我使用我创建的 spt 页面时,它会显示转义序列,例如: Educa\xc3\xa7\xc3\xa3o 代替 Educ
我正在尝试开始使用 Emacs/Clojure。安装 emacs 扩展的正确方法是什么。我正在尝试安装以下插件: https://bitbucket.org/kotarak/vimclojure 我已
我有一个简单的 C 项目结构: proj/ src/ docs/ build/ tests/ lib/ 尝试编写合适的 CMake 文件。 到目前为止我的尝试:http://pas
我是一名优秀的程序员,十分优秀!