Xunit.DependencyInjection 7.0 发布了

Intro

上次我们已经介绍过一次大师的 Xunit.DependencyInjection  在 Xunit 中使用依赖注入 ,最近大师完成了 7.0 的重构并且已经正式发布,已经可以直接安装使用了

7.0 为我们带来了更好的编程体验,在 6.x 的版本中,我们的 Startup 需要继承于 DependencyInjectionTestFramework 而且需要设置一个 assembly attribute,这在 7.0 中都不需要了,下面我们来看看有了哪些变化

Startup 的变化

首先来看下大师给出的 diff


-[assembly: TestFramework("Your.Test.Project.Startup", "Your.Test.Project")]namespace Your.Test.Project
{
-   public class Startup : DependencyInjectionTestFramework
+   public class Startup{
-       public Startup(IMessageSink messageSink) : base(messageSink) { }-       protected void ConfigureServices(IServiceCollection services)
+       public void ConfigureServices(IServiceCollection services){services.AddTransient<IDependency, DependencyClass>();}-       protected override IHostBuilder CreateHostBuilder() =>
-           base.CreateHostBuilder(assemblyName)
-               .ConfigureServices(ConfigureServices);-       protected override void Configure(IServiceProvider provider)
+       public void Configure(IServiceProvider provider)}
}
  1. 移除了 TestFramework assembly attribute

  2. 不再需要继承于 DependencyInjectionTestFramework

  3. 也因为上面的不需要继承,所以原本要 override 的方法可以不 override 了,原来是 protected 的方法现在需要改成 public

新的 Startup 解析

我把上一篇文章写的示例用升级到了新的版本,下面是更新后的示例代码

namespace XUnitDependencyInjectionSample
{public class Startup{// 自定义 HostBuilder ,可以没有这个方法,没有这个方法会使用默认的 hostBuilder,通常直接使用 `ConfigureHost` 应该就够用了// public IHostBuilder CreateHostBuilder()// {//     return new HostBuilder()//         .ConfigureAppConfiguration(builder =>//         {//             // 注册配置//             builder//                 .AddInMemoryCollection(new Dictionary<string, string>()//                 {//                     {"UserName", "Alice"}//                 })//                 .AddJsonFile("appsettings.json")//                 ;//         })//         .ConfigureServices((context, services) =>//         {//             // 注册自定义服务//             services.AddSingleton<IIdGenerator, GuidIdGenerator>();//             if (context.Configuration.GetAppSetting<bool>("XxxEnabled"))//             {//                 services.AddSingleton<IUserIdProvider, EnvironmentUserIdProvider>();//             }//         })//         ;// }// 自定义 host 构建public void ConfigureHost(IHostBuilder hostBuilder){hostBuilder.ConfigureAppConfiguration(builder =>{// 注册配置builder.AddInMemoryCollection(new Dictionary<string, string>(){{"UserName", "Alice"}}).AddJsonFile("appsettings.json");}).ConfigureServices((context, services) =>{// 注册自定义服务services.AddSingleton<IIdGenerator, GuidIdGenerator>();if (context.Configuration.GetAppSetting<bool>("XxxEnabled")){services.AddSingleton<IUserIdProvider, EnvironmentUserIdProvider>();}});}// 支持的形式:// ConfigureServices(IServiceCollection services)// ConfigureServices(IServiceCollection services, HostBuilderContext hostBuilderContext)// ConfigureServices(HostBuilderContext hostBuilderContext, IServiceCollection services)public void ConfigureServices(IServiceCollection services, HostBuilderContext hostBuilderContext){services.TryAddSingleton<CustomService>();}// 可以添加要用到的方法参数,会自动从注册的服务中获取服务实例,类似于 asp.net core 里 Configure 方法public void Configure(IServiceProvider applicationServices, IIdGenerator idGenerator){// 有一些测试数据要初始化可以放在这里// InitData();}}
}

在新的版本中 Startup 和 asp.net core 里的 Startup 更加相像了,

会多一个 CreateHostBuilder/ConfigureHost(IHostBuilder) 的方法,允许用户自定义 Host 的构建,也可以没有这个方法

ConfigureServices 方法允许用户增加 HostBuilderContext 作为参数,可以通过 hostBuilderContext 来获取配置信息,也可以在 CreateHostBuilder/ConfigureHost(IHostBuilder) 里注册也是一样的

注册配置/服务和 asp.net core 里一模一样,有数据或配置需要在项目启动时初始化的,可以放在 Configure  方法做,有点类似于 asp.net core 里 Startup 中的 Configure 方法,可以将需要的服务作为方法参数,执行时会自动从注册的服务中获取

Startup 的寻找方法

默认的 Startup 通常是 ProjectName.Startup,通常在项目根目录下创建一个 Startup 是不需要配置的,如果不是或不起作用,可以参考下面 Startup 的寻找规则

如果要使用一个特别的 Startup, 你可以通过在项目文件的 PropertyGroup 部分定义 XunitStartupAssemblyXunitStartupFullName,具体规则如下

<Project><PropertyGroup><XunitStartupAssembly>Abc</XunitStartupAssembly><XunitStartupFullName>Xyz</XunitStartupFullName></PropertyGroup>
</Project>
XunitStartupAssembly XunitStartupFullName Startup
Your.Test.Project.Startup, Your.Test.Project
Abc Abc.Startup, Abc
Xyz Xyz, Your.Test.Project
Abc Xyz Xyz, Abc

More

除了上面的 Startup 的改动之外,新版本还支持了 xunit 中 fixture 的依赖注入,似乎是由一个外国小哥提的 PR, 详见:https://github.com/pengweiqhca/Xunit.DependencyInjection/pull/21

有了这个神器,在测试代码中使用依赖注入要方便很多了,还没有用起来的可以准备上手了~~

Reference

  • https://github.com/pengweiqhca/Xunit.DependencyInjection

  • https://github.com/WeihanLi/SamplesInPractice/tree/master/XUnitDependencyInjectionSample

更优雅的在 Xunit 中使用依赖注入相关推荐

  1. 在 Xunit 中使用依赖注入

    在 Xunit 中使用依赖注入 Intro 之前写过一篇 xunit 的依赖注入相关的文章,但是实际使用起来不是那么方便 今天介绍一个基于xunit和微软依赖注入框架的"真正"的依 ...

  2. spring中的依赖注入——构造函数注入、set方法注入( 更常用的方式)、复杂类型的注入/集合类型的注入

    spring中的依赖注入 依赖注入: Dependency Injection IOC的作用:降低程序间的耦合(依赖关系) 依赖关系的管理:以后都交给spring来维护.在当前类需要用到其他类的对象, ...

  3. ASP.NET Core 中的依赖注入

    什么是依赖注入 软件设计原则中有一个依赖倒置原则(DIP),为了更好的解耦,讲究要依赖于抽象,不要依赖于具体.而控制反转(Ioc)就是这样的原则的其中一个实现思路, 这个思路的其中一种实现方式就是依赖 ...

  4. 转: 理解AngularJS中的依赖注入

    理解AngularJS中的依赖注入 AngularJS中的依赖注入非常的有用,它同时也是我们能够轻松对组件进行测试的关键所在.在本文中我们将会解释AngularJS依赖注入系统是如何运行的. Prov ...

  5. 理解AngularJS中的依赖注入

    作者 CraftsCoder 冷月无声 - 博客频道 - CSDN.NET http://blog.csdn.net/jaytalent/article/details/50986402 本文结合一些 ...

  6. Angular 中的依赖注入link

    Angular 中的依赖注入link 依赖注入(DI)是一种重要的应用设计模式. Angular 有自己的 DI 框架,在设计应用时常会用到它,以提升它们的开发效率和模块化程度. 依赖,是当类需要执行 ...

  7. ASP.NET CORE MVC 2.0 如何在Filter中使用依赖注入来读取AppSettings

    问: ASP.NET CORE MVC 如何在Filter中使用依赖注入来读取AppSettings 答: Dependency injection is possible in filters as ...

  8. 如何在 Web Forms 中引入依赖注入机制

    依赖注入技术就是将一个对象注入到一个需要它的对象中,同时它也是控制反转的一种实现,显而易见,这样可以实现对象之间的解耦并且更方便测试和维护,依赖注入的原则早已经指出了,应用程序的高层模块不依赖于低层模 ...

  9. dagger2 注入_如何使用Dagger 2在您的应用程序中实现依赖注入

    dagger2 注入 Kriptofolio应用程序系列-第4部分 (Kriptofolio app series - Part 4) Dependency injection will signif ...

最新文章

  1. java教学目标_成为Java高手的25个学习目标
  2. HTTP 协议的通用头域via 的意义以及作用
  3. 架构设计的本质:系统与子系统、模块与组件、框架与架构
  4. SQL_Server2008数据连接池
  5. 校外导师互选 页面设计
  6. 同一个网站下不同应用程序可以不同Framework版本
  7. ie11 不能调试 因为 ie的bug
  8. IDC:物联网计划对IT基础设施影响重大
  9. HDFS副本放置策略
  10. 《南溪的目标检测学习笔记》——训练PyTorch模型遇到显存不足的情况怎么办(“OOM: CUDA out of memory“)
  11. python字典添加列表,将Python字典/列表插入到SQL数据库中最有效的方法是什么?...
  12. 11.这就是搜索引擎:核心技术详解 --- 搜索引擎缓存机制
  13. Linux中tar命令用法
  14. java tracert_超强的Tracert工具(WinMTR)
  15. css磨砂效果背景和特殊背景
  16. 计算机考试有python吗_计算机二级考试有python吗
  17. ARINC615-3 与 ARINC844 PART2 协议解析 思维导图
  18. window7修改屏幕旋转快捷键
  19. nltk.stem 词干提取(stemming)
  20. EffectCreator for mac(抖音短视频编辑软件)

热门文章

  1. 有两个地方,用到了javabean对象和属性字符串值之间的转换
  2. BFS HDOJ 2102 A计划
  3. 如何在Safari中查看网页的完整URL
  4. Intellij IDEA2017 的控制台里不识别maven命令问题处理
  5. Fiddler抓包5-接口测试(Composer)
  6. 美国银行将AI应用于企业应收账款处理
  7. Oracle精简客户端配置
  8. 如何使用CPU来加速你的Linux命令
  9. 【转】学习apicloud和IOS之间的模块化使用
  10. CSS text-indent 属性