Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .net core 3.0,服务未使用HostBuilder注册以进行集成测试_C#_Testing_.net Core_Integration Testing - Fatal编程技术网

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

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

存储库位于以下位置:

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

        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
方法中注册它。

是的,我刚才看到了!你是真的!!谢谢