Я использовал свои модульные тесты на .Net5 (или ниже) с DependencyResolverHelper, как показано ниже. Это мой базовый тестовый класс
public abstract class BaseTestClass
{
protected DependencyResolverHelper _serviceProvider;
public BaseTestClass()
{
var webHost = WebHost.CreateDefaultBuilder()
.UseStartup<Startup>()
.Build();
_serviceProvider = new DependencyResolverHelper(webHost);
}
}
и мой DependencyResolverHelper
public class DependencyResolverHelper
{
private readonly IWebHost _webHost;
/// <inheritdoc />
public DependencyResolverHelper(IWebHost webHost) => _webHost = webHost;
public T GetService<T>()
{
var serviceScope = _webHost.Services.CreateScope();
var services = serviceScope.ServiceProvider;
try
{
var scopedService = services.GetRequiredService<T>();
return scopedService;
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
}
но я немного запутался с новыми вещами зависимости .NET 6. Кто-нибудь пробовал это без класса запуска?
Я попытался изменить его с помощью
WebApplicationBuilder
но это дало Служба для типа MinimalAPI.Services.TokenService.ITokenService не зарегистрирована. ошибка.
Просто потому, что эта часть кодов .UseStartup<Startup>()
вызывает класс запуска и регистрирует службы для вас, если вы попытаетесь использовать WebApplicationBuilder в .net 6, вам придется зарегистрировать службы самостоятельно,
Я пробовал, как показано ниже:
public void Test1()
{
var builder = WebApplication.CreateBuilder(new WebApplicationOptions() { });
builder.Services.AddSingleton<ISomeService,SomeService>();
var app = builder.Build();
var serviceProvider = new DependencyResolverHelper(app);
var someservice = serviceProvider.GetService<ISomeService>();
Assert.Equal(typeof(SomeService), someservice.GetType());
}
Класс DependencyResolverHelper:
public class DependencyResolverHelper
{
private readonly WebApplication _app;
/// <inheritdoc />
public DependencyResolverHelper(WebApplication app) => _app = app;
public T GetService<T>()
{
var serviceScope = _app.Services.CreateScope();
var services = serviceScope.ServiceProvider;
try
{
var scopedService = services.GetRequiredService<T>();
return scopedService;
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
}
Результат:
Какой смысл всегда создавать новую область видимости? И эти области никогда не утилизируются?