Невозможно полностью удалить встроенный DI-контейнер из ASP.NET Core, поскольку он полностью интегрирован во весь процесс;все зависит от его существования.
Это означает, что как разработчик приложения, так или иначе, вам придется взаимодействовать с ним в какой-то момент, когда речь заходит об изменении поведения по умолчанию.
Этооднако это не означает, что вы вынуждены использовать встроенный DI-контейнер или фактически используете любой контейнер для построения графов объектов приложения комплектующие.Построение графов объектов без использования контейнера DI - довольно распространенная практика, называемая Pure DI , и это, по большей части, возможно и при использовании ASP.NET Core.
Если вы хотите практиковать Pure DI, это обычно означает замену нескольких общих точек перехвата.На такой общей точке перехвата находится IControllerActivator
абстракция.Заменив реализацию по умолчанию, вы можете перехватить создание экземпляров контроллера MVC, которые обычно являются корневыми объектами графов объектов вашего приложения. Вот пример репозитория Github , который демонстрирует, как применять Pure DI при создании контроллеров.
Однако в вашем примере вы, похоже, имеете дело только с пользовательским промежуточным ПО.В этом случае проще использовать Pure DI, поскольку он не требует замены фабричных абстракций, таких как IControllerActivator
.Это можно сделать следующим образом:
var middleware = new MyMiddleware(_dep1, _dep2);
app.Use((context, next) =>
{
return middleware.InvokeAsync(context, next);
});
Обратите внимание, как я переместил RequestDelegate
из конструктора MyMiddleware
в метод InvokeAsync
.Причина для этого заключается в том, что это позволяет создавать MyMiddleware
независимо от любых значений времени выполнения.RequestDelegate
- это значение времени выполнения, а в предыдущем примере MyMiddleware
создается только один раз при запуске.Другими словами, это просто Singleton.
В случае, если MyMiddleware
содержит некоторое изменяемое состояние и, следовательно, не может кэшироваться бесконечно, вы можете создать его внутри делегата.Это означает, что он будет создан один раз за запрос.