Хотя я не фанат шаблона поиска сервисов, текущий дизайн конфигурации бота не очень удобен для внедрения зависимостей.
Использование характера настройки промежуточного программного обеспечения бота, но необходимость предоставления новогоНапример, во время запуска я обошел следующую работу:
public class BotMiddlewareAdapter<TMiddleware> : IMiddleware
where TMiddleware : IMiddleware {
private readonly Lazy<TMiddleware> middleware;
public BotMiddlewareAdapter(IServiceCollection services) {
middleware = new Lazy<TMiddleware>(() =>
services.BuildServiceProvider().GetRequiredService<TMiddleware>());
}
public Task OnTurn(ITurnContext context, MiddlewareSet.NextDelegate next) {
return middleware.Value.OnTurn(context, next);
}
}
Он принимает IServiceCollection
в качестве явной зависимости и откладывает создание поставщика услуг и возможное разрешение фактического промежуточного программного обеспечения на фабрике.делегат.
Затем он может быть реализован с использованием
middleware.Add(new BotMiddlewareAdapter<MyCustomMiddleware>(services));
. Когда вызывается адаптер, он лениво разрешает намеченное промежуточное ПО при первоначальном вызове, а затем вызывает его.
ВФактически, вы можете сделать еще один шаг и преобразовать его в метод расширения
public static class BotBuilderMiddlewareExtension {
public static void Add<TMiddleware>(this IList<IMiddleware> middleware, IServiceCollection services)
where TMiddleware : IMiddleware {
middleware.Add(new BotMiddlewareAdapter<TMiddleware>(services));
}
}
, который упрощает настройку до
middleware.Add<MyCustomMiddleware>(services);