Еще один способ сделать это - создать промежуточное ПО с помощью интерфейса IMiddleware
и зарегистрировать его в качестве службы
Например, промежуточное ПО
public class CreateCompanyMiddlewareByInterface : IMiddleware
{
private readonly UserManager<ApplicationUser> _userManager;
public CreateCompanyMiddlewareByInterface(UserManager<ApplicationUser> userManager )
{
this._userManager = userManager;
}
public Task InvokeAsync(HttpContext context, RequestDelegate next)
{
return next(context);
}
}
и регистрация услуги:
services.AddScoped<CreateCompanyMiddlewareByInterface>();
- Так почему же это происходит?
Промежуточное программное обеспечение, использующее IMiddleware
, создано UseMiddlewareInterface(appBuilder, middlewareType type)
:
private static IApplicationBuilder UseMiddlewareInterface(IApplicationBuilder app, Type middlewareType)
{
return app.Use(next =>
{
return async context =>
{
var middlewareFactory = (IMiddlewareFactory)context.RequestServices.GetService(typeof(IMiddlewareFactory));
if (middlewareFactory == null) { /* throw ... */ }
var middleware = middlewareFactory.Create(middlewareType);
if (middleware == null) { /* throw ... */ }
try{
await middleware.InvokeAsync(context, next);
}
finally{
middlewareFactory.Release(middleware);
}
};
});
}
здесь коды внутри context=>{}
выполняются по запросу. Таким образом, каждый раз, когда поступает входящий запрос, var middleware = middlewareFactory.Create(middlewareType);
будет выполняться, а затем запрашивать промежуточное программное обеспечение middlewareType
(которое уже зарегистрировано как услуга) из ServiceProvider
.
Что касается промежуточного программного обеспечения в соответствии с соглашением, его не существует на фабрике.
Все эти экземпляры создаются ActivatorUtilities.CreateInstance()
во время запуска. И любой Invoke
метод промежуточного программного обеспечения по соглашению, такой как
Task Invoke(HttpContext context,UserManager<ApplicationUser> userManage, ILoggerFactory loggeryFactory , ... )
будет скомпилировано в функцию, подобную приведенной ниже:
Task Invoke(Middleware instance, HttpContext httpContext, IServiceprovider provider)
{
var useManager /* = get service from service provider */ ;
var log = /* = get service from service provider */ ;
// ...
return instance.Invoke(httpContext,userManager,log, ...);
}
Как видите, здесь экземпляр создается во время запуска, и эти службы метода Invoke
запрашиваются для каждого запроса.