Я пишу интеграционные тесты для существующего проекта. В проекте используется Autofa c в качестве IO C. Я не могу понять, как заменить сервис, который был зарегистрирован Autofa c.
Я использую. net core 3.1 и Autofa c 4.9.4 и Autofa c .Extensions.DependencyInjection 5.0.1 Часть службы, зарегистрированная в стандарте. net core IO C, метод выглядит так
public virtual void ConfigureServices(IServiceCollection services)
{
.....
services.AddHangfireServer();
services.TryAddTransient<IEfCoreEventDispatcher, EfCoreEventDispatcher>();
.....
}
, затем регистрирует модули Autofa c в другом методе, который должен вызываться фабрикой autofa c (не уверен насчет этого утверждения)
public void ConfigureContainer(ContainerBuilder builder)
{
....
builder.RegisterModule<AutofacApplicationModule>();
builder.RegisterType<MolliePaymentClientFactory>().AsImplementedInterfaces();
....
}
В program.cs я указываю собственную фабрику для поставщика услуг в соответствии с документацией autofa c.
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureWebHostDefaults(webHostBuilder => webHostBuilder
.UseSerilog()
.UseStartup<Startup>());
В тесте интеграции я создаю пользовательскую WebApplicationFactoty
public class CustomWebApplicationFactory<TStartup> : WebApplicationFactory<TStartup> where TStartup : class
{
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
builder.ConfigureServices(services =>
{
services.Replace(new ServiceDescriptor(typeof(IEfCoreEventDispatcher), typeof(EfCoreEventDispatcherFake), ServiceLifetime.Transient));
// Remove the app's AppDbContext registration.
var descriptor = services.SingleOrDefault(d => d.ServiceType == typeof(DbContextOptions<AppDbContext>));
if (descriptor != null)
services.Remove(descriptor);
// Add ApplicationDbContext using an in-memory database for testing.
services.AddDbContext<AppDbContext>(options => options.UseInMemoryDatabase("testDb"));
var hangfireMock = new Mock<IBackgroundJobClient>();
services.Replace(new ServiceDescriptor(typeof(IBackgroundJobClient), hangfireMock.Object));
});
}
}
Я могу заменить службу, которая была зарегистрирована в Microsoft IO C, но не могу заменить службу, которая была зарегистрирована в Autofa c
Когда я пытаюсь позвонить
var descriptor = services.SingleOrDefault(d => d.ServiceType == typeof(IMolliePaymentClientFactory));
результат равен нулю, он еще не доступен на момент вызова "ConfigureServices", и я не могу найти способ сделать это ,
Кто-нибудь может помочь мне решить эту проблему?