C# .net core 3.0,服务未使用HostBuilder注册以进行集成测试
存储库位于以下位置: 我正在寻找一种从.Net Core 2.0升级到3.0我的集成测试的方法。 我真的尽了最大的努力来注入一个该死的服务,正如你所看到的,我尽了我所能:C# .net core 3.0,服务未使用HostBuilder注册以进行集成测试,c#,testing,.net-core,integration-testing,C#,Testing,.net Core,Integration Testing,存储库位于以下位置: 我正在寻找一种从.Net Core 2.0升级到3.0我的集成测试的方法。 我真的尽了最大的努力来注入一个该死的服务,正如你所看到的,我尽了我所能: var hostBuilder = new HostBuilder() .UseServiceProviderFactory(new AutofacServiceProviderFactory()) .ConfigureLogging(logging =>
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
});
});
var hostBuilder=new hostBuilder()
.UseServiceProviderFactory(新的AutofacServiceProviderFactory())
.ConfigureLogging(日志=>
{
logging.ClearProviders();
logging.AddXunit(输出);
})
.ConfigureServices(服务=>
{
services.AddAutofac();
services.AddSingleton();//此处
})
.ConfigureContainer(生成器=>
{
builder.RegisterType().As().InstancePerLifetimeScope();//此处
})
.ConfigureWebHost(webHost=>
{
//添加测试服务器
网络主机
.UseStartup()
.UseTestServer()文件
.ConfigureServices(服务=>
{
services.AddSingleton();//此处
services.AddAutofac();
服务
.AddControllers()
.AddApplicationPart(类型(TestStartup).Assembly);
})
.ConfigureTestServices(服务=>
{
services.AddSingleton();//此处
services.AddAutofac();
服务
.AddControllers()
.AddApplicationPart(类型(TestStartup).Assembly);
})
.ConfigureTestContainer(生成器=>
{
builder.RegisterType().As().InstancePerLifetimeScope();//此处
});
});
但是你猜怎么着?它根本不起作用。。。我真的不知道怎样才能让主机制造商明白。。。
当然,我试着只保留一种注入服务的方法
因此,当我想要获得服务时:
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);
}
}
Host=hostBuilder.Start();
Server=Host.GetTestServer();
Client=Host.GetTestClient();
使用(var scope=Host.Services.CreateScope())
{
var services=scope.ServiceProvider;
尝试
{
var myService=services.GetRequiredService();
}
捕获(例外情况除外)
{
Output.WriteLine(“主机:+ex.Message”);
}
}
使用(var scope=Server.Services.CreateScope())
{
var services=scope.ServiceProvider;
尝试
{
var myService=services.GetRequiredService();
}
捕获(例外情况除外)
{
Output.WriteLine(“服务器:”+ex.Message);
}
}
错误消息是:
请求的服务“MyAPI.Services.MyService”尚未启动
注册的。若要避免此异常,请将组件注册到
提供服务,使用检查服务注册
IsRegistered(),或使用ResolveOptional()方法解析
可选依赖项
您如何成功地在HostBuilder中注入服务?您已经注册,每当有人要求
IMyService
时,请给他们一个MyService
的实例-但是您直接要求MyService
,而DI对此一无所知
您需要将注册更改为:
builder.RegisterType<MyService>().InstancePerLifetimeScope();
builder.RegisterType();
或者请求接口而不是类:
services.GetRequiredService<IMyService>();
services.GetRequiredService();
另外,您只需要在
ConfigureContainer
方法中注册它。是的,我刚才看到了!你是真的!!谢谢