Xunit.DependencyInjection 7.0 <公【布】「了」>

Intro

上次我们已经先容过一次大师《的》 Xunit.DependencyInjection https://www.cnblogs.com/weihanli/p/xuint-dependency-injection.html ,最近大师完成「了」 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

这样改「了」之后首先我们(在使用《的》时刻无需)知道 DependencyInjectionTestFramework 《的》存在「了」,而且可以更相符 asp.net core Startup 《的》使用习惯,可以屏蔽掉许多实现细〖节〗,‘用户只需’要在 Startup ‘注’册自己《的》逻辑即可,更为专注于自己《的》逻辑而无需体贴框架所做《的》事情

新《的》 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 部门界说 XunitStartupAssembly 和[ XunitStartupFullName,详细规则如下

<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
,

欧博亚洲电脑版下载

欢迎进入欧博亚洲电脑版下载(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团《的》官方网站。欧博官网开放Allbet‘注’册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。

Allbet Gaming声明:该文看法仅代表作者自己,与阳光在线无关。转载请注明:allbet<网址>:更优雅的在 Xunit 中使用依赖注入
发布评论

分享到:

美国新增新冠肺炎确诊病例55431例 累计7706256例
3 条回复
  1. appledeveloperenterpriseaccountforrent
    appledeveloperenterpriseaccountforrent
    (2020-07-29 00:04:03) 1#

    Us apple developer accounts for saleAppledeveloper.io is a reputed website selling apple developer account, providing us, China and worldwide developer individual accounts for sale. It's at low price and good quality. Always provides satisfying services!已入坑,出不来了

  2. 环球UG客户端下载
    环球UG客户端下载
    (2020-10-12 00:01:10) 2#

    欧博亚洲欢迎进入欧博亚洲(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。水一下,我在看

  3. 环球UG客户端下载
    环球UG客户端下载
    (2020-10-12 00:01:14) 3#

    欧博亚洲欢迎进入欧博亚洲(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。水一下,我在看

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。