我试图理解MVC6中的中间件概念。对我来说仍然有点模糊。我真的看不到您在Startup
课堂上得到的几个“标准”变量之间的区别。
据我所知,有3种不同的方式告诉应用程序应使用特定的中间件?
您可以使用通过服务调用中间件。但这似乎仅用于“添加”中间件吗?
services.AddMvc();
// Add other services
services.AddScoped<IMyCountriesRepository, MyCountriesRepository>();
services.AddScoped<IEmailer, Emailer>();
那你有IApplicationBuilder app
。这是要实际使用服务中加载的中间件吗?因此,您可以这样称呼它:
app.UseMvc();
app.UseErrorPage(...);
app.UseIdentity(); // cookie authentication
然后有一种加载和使用中间件的方法,如下所示:
app.UseMiddleware<MyCustomMiddleware>();
拥有三种类型的注册/使用中间件的好处是什么?它们之间的确切区别是什么?
我将在添加服务和添加中间件之间进行区分。
添加服务
这基本上是将功能所需的类注册到ASP.Net 5中内置的依赖项注入容器中。(IServiceCollection
接口)
您可以执行的最简单的操作是手动将它们一一添加,如下所示:
services.AddScoped<IMyCountriesRepository, MyCountriesRepository>();
services.AddScoped<IEmailer, Emailer>();
如果要构建更复杂的应用程序或自包含框架,则可能需要创建一个注册所有所需服务的函数。一个好的方法是创建一个扩展方法:
public static void AddMyServices(this IServiceCollection services)
{
services.AddScoped<IMyCountriesRepository, MyCountriesRepository>();
services.AddScoped<IEmailer, Emailer>();
...
}
//register all your services just by running the ext method:
services.AddMyServices();
那正是services.AddMvc();
在做什么。
以一种更灵活的方式,它允许您传递lambda来进一步自定义默认服务,例如模型绑定程序(Like
services.AddMvc(opts => opts.ModelBinders ...)
),并返回IMvcBuilder,您可以使用它进一步自定义它,例如视图引擎(Likeservices.AddMvc().AddViewOptions(opts => opts.ViewEngines ...)
)。
添加中间件
ASP .Net 5不是基于HTTP模块和处理程序,而是基于OWIN中间件的思想。Andrei Dzimchuk有一个不错的博客条目,描述了中间件,很好地总结了该中间件:
中间件–穿过组成服务器和应用程序之间管道的组件,以检查,路由或修改用于特定目的的请求和响应消息。
而且此定义也适用于ASP.NET 5。可以将中间件视为我们在经典ASP.NET中拥有的HTTP模块和处理程序。一些中间件在处理请求时将执行各种中间任务,例如身份验证,会话状态检索和持久性,日志记录等。其中一些将是最终的请求处理程序,将产生响应。
因此,现在您想将自己的行为添加到ASP管道中。
最简单的事情是定义一个内联中间件:
app.Use(async (context, next) =>
{
//do something before passing the request to the next middleware
await next.Invoke();
});
您还可以创建自己的中间件类并进行注册:
app.UseMiddleware<MyMiddleware>();
最后,您可以再次定义扩展方法以封装复杂的设置逻辑。
这是做什么的
app.UseMvc()
。它允许您定义路由,然后通过调用添加路由中间件app.UseRouter()
。如您所见,的实现通过app.UseRouter
将RouterMiddleware
的调用添加到管道中builder.UseMiddleware<RouterMiddleware>(router);
您的中间件所需的任何服务都已预先注册。这意味着它们将通过内置的DI容器提供给您的中间件。
最终结果是,该框架使您更容易从根本上混合和匹配应用程序所需的组件(服务)和行为(中间件),仅包括所需的位。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句