存储库可在此处获得: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/