gpt4 book ai didi

c# - .net core 3.0,服务未使用 HostBuilder 注册以进行集成测试

转载 作者:行者123 更新时间:2023-11-28 21:15:26 27 4
gpt4 key购买 nike

存储库可在此处获得:https://github.com/ranouf/TestingWithDotNetCore3_0/tree/WithDatabase

我正在寻找一种方法将我的集成测试从 .Net Core 2.0 升级到 3.0。我真的尽了最大努力来注入(inject)一个该死的服务,正如你所看到的,我尽我所能:

        var hostBuilder = new HostBuilder()
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureLogging(logging =>
{
logging.ClearProviders();
logging.AddXunit(Output);
})
.ConfigureServices(services =>
{
services.AddAutofac();
services.AddSingleton<IMyService, MyService>(); //Here
})
.ConfigureContainer<ContainerBuilder>(builder =>
{
builder.RegisterType<MyService>().As<IMyService>().InstancePerLifetimeScope();//Here
})
.ConfigureWebHost(webHost =>
{
// Add TestServer
webHost
.UseStartup<TestStartup>()
.UseTestServer()
.ConfigureServices(services =>
{
services.AddSingleton<IMyService, MyService>();//Here
services.AddAutofac();
services
.AddControllers()
.AddApplicationPart(typeof(TestStartup).Assembly);
})
.ConfigureTestServices(services =>
{
services.AddSingleton<IMyService, MyService>();//Here
services.AddAutofac();
services
.AddControllers()
.AddApplicationPart(typeof(TestStartup).Assembly);
})
.ConfigureTestContainer<ContainerBuilder>(builder =>
{
builder.RegisterType<MyService>().As<IMyService>().InstancePerLifetimeScope();//Here
});
});

但是你猜怎么着?它根本不起作用......我真的不知道如何让 HostBuilder 理解......当然,我尝试过只保留一种方式来注入(inject)我的服务

所以当我想获得服务时:

    Host = hostBuilder.Start();
Server = Host.GetTestServer();
Client = Host.GetTestClient();

using (var scope = Host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
var myService = services.GetRequiredService<MyService>();
}
catch (Exception ex)
{
Output.WriteLine("HOST: " + ex.Message);
}
}
using (var scope = Server.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
var myService = services.GetRequiredService<MyService>();
}
catch (Exception ex)
{
Output.WriteLine("SERVER: " + ex.Message);
}
}

错误信息是:

The requested service 'MyAPI.Services.MyService' has not been registered. To avoid this exception, either register a component to provide the service, check for service registration using IsRegistered(), or use the ResolveOptional() method to resolve an optional dependency.

如何在 HostBuilder 中成功注入(inject)服务?

最佳答案

您已经注册,每当有人请求 IMyService 时,都会给他们一个 MyService 的实例 - 但您直接请求 MyService 而 DI 没有对此一无所知。

您需要将注册更改为:

builder.RegisterType<MyService>().InstancePerLifetimeScope();

或者要求接口(interface)而不是类:

services.GetRequiredService<IMyService>();

另外,你只需要在ConfigureContainer方法中注册即可。

关于c# - .net core 3.0,服务未使用 HostBuilder 注册以进行集成测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59275542/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com