如何从Startup.cs获取所有服务

时间:2019-08-05 06:18:53

标签: c# asp.net-core .net-core xunit

在StartupClass运行后如何获得所有服务?

我们有一个启动配置服务类,该类 运行多个依赖项注入。

 serviceCollection.AddScoped<IDepartmentRepository, DepartmentRepository>();
 serviceCollection.AddScoped<IDepartmentAppService, DepartmentAppService>();

团队正在使用Xunit测试项目,并希望获取Xunit的所有服务集合列表。

需要以下服务:

new WebHostBuilder()
            .UseContentRoot("C:\\Test\\Test.WebAPI")
            .UseEnvironment("Development")
            .UseConfiguration(new ConfigurationBuilder()
                .SetBasePath("C:\\Test\\Test.WebAPI")
                .AddJsonFile("appsettings.json")
                .Build()).UseStartup<Startup>());

2 个答案:

答案 0 :(得分:0)

ServiceCollection中的服务由ServiceDescriptor类表示。通过将ConfigureTestServices方法链接到您的WebHostBuilder(您必须安装Microsoft.AspNetCore.TestHost软件包),可以获得所有服务描述符的列表

using Microsoft.AspNetCore.TestHost;

....

IWebHost CreateWebHost(out ServiceDescriptor[] allServices)
{
    ServiceDescriptor[] grabbedServices = null;

    var host = new WebHostBuilder()
        // ... other stuff ...
        .UseStartup<Startup>()
        // add the following call:
        .ConfigureTestServices(services => {
            // copy all service descriptors
            grabbedServices = services.ToArray(); 
        })
        // build the host now to trigger the above chain
        .Build();

    allServices = grabbedServices;
    return host;
}

这样方便使用:

[Fact]
public void TestSomething()
{
    // arrange

    var host = CreateWebHost(out var services);
    // ... do something with the services

    // act
    // assert    
}

我们必须使用ConfigureTestServices(而不是ConfigureServices)的原因是,ConfigureServices总是在Startup类中的方法之前被调用,而{{1} }。

更新

当然,也可以将对ConfigureTestServices的引用存储在变量/字段中,并在必要时枚举服务。

答案 1 :(得分:0)

因此,我了解您要测试服务的问题,并且在将它们加载到测试项目中时遇到问题。 我会说你不需要。每次测试单一服务时,在单元测试中。您直接实例化此服务:

var target= new ServiceToTest();

因此,您从测试项目中引用了testED项目。如果您的实现是内部的,请向您的testED项目添加一个AssemblyInfo.cs文件,并将以下内容放入其中:

[assembly: InternalsVisibleTo("MyTestProject")]

每当测试MyServiceToTest1时,如果它依赖于MyServiceTest2,则不必加载或实例化MyServiceTest2。相反,您嘲笑它,例如与 moq