Я использую пользовательскую фабрику веб-приложений
public class CustomWebApplicationFactory<TStartup> : WebApplicationFactory<TStartup> where TStartup: class {
protected override void ConfigureWebHost(IWebHostBuilder builder) {
builder.ConfigureServices(services => {
// Create a new service provider.
var serviceProvider = new ServiceCollection()
.AddEntityFrameworkInMemoryDatabase()
.BuildServiceProvider();
services.AddDbContext<GrabGoContext>(options => {
options.UseInMemoryDatabase("GrabGoDb");
options.UseInternalServiceProvider(serviceProvider);
});
services.AddSingleton<TestEmailServer>();
services.AddScoped<IEmailProvider, TestEmailProvider>(); // <- HERE
});
base.ConfigureWebHost(builder);
}
Я хочу переключить мою службу по умолчанию IEmailProvider
с именем DefaultEmailProvider
на мой специальный TestEmailProvider
, но проблема в том, что метод ConfigureWebHost
выполняется до Startup.ConfigureServices(IServiceCollection services)
, поэтому мой сервис DefaultEmailProvider
устанавливается после TestEmailProvider
.Поэтому в моем ClientController
сервисе DeafultEmailProvider
используется вместо тестового сервиса.
Мой вопрос:
Как я могу переключить сервис DefaultEmailProvider
с моим TestEmailProvider
, используя WebApplicationFactory?
@ Update
Хорошо, мне удалось углубиться.Я обнаружил, что метод builder.ConfigureTestServices()
переопределяет другие службы.Но когда я переключаю это в моем методе ConfigureWebHost(IWebHostBuilder builder)
, и я пытаюсь создать новый HttpClient, используя CreateClient()
, он выдает:
System.InvalidOperationException: 'A ConfigureServices method that returns an IServiceProvider is not compatible with the use of one or more IStartupConfigureServicesFilter. Use a void returning ConfigureServices method instead or a ConfigureContainer method.'
@ Update 28.05.2019
Все еще ищулучшее решение , но мне удается сделать что-то вроде взломать .
В моем Startup.cs
я поменял свой
services.AddScoped<IEmailProvider, SendGridEmailProvider>();
с TryAdd [Something]
services.TryAddScoped<IEmailProvider, SendGridEmailProvider>();