MVC6中的应用程序,服务和中间件之间的区别

维旺迪

我试图理解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>();

拥有三种类型的注册/使用中间件的好处是什么它们之间的确切区别是什么?

丹尼尔·JG

我将在添加服务和添加中间件之间进行区分。

添加服务

这基本上是将功能所需的类注册到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,您可以使用它进一步自定义它,例如视图引擎(Like services.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.UseRouterRouterMiddleware的调用添加到管道中builder.UseMiddleware<RouterMiddleware>(router);

您的中间件所需的任何服务都已预先注册。这意味着它们将通过内置的DI容器提供给您的中间件。


最终结果是,该框架使您更容易从根本上混合和匹配应用程序所需的组件(服务)和行为(中间件),仅包括所需的位。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Amazon Alexa,Alexa应用程序和中间件

快速中间件中的参考应用程序

在Flask应用程序中安装Appstats中间件

在中间件内通过环回 4 应用程序中的请求保留服务器对象以进行缓存

我可以在较旧的MVC3应用程序中运行OWIN中间件吗

Laravel 5中的中间件和服务提供者之间的区别?

用于从 .NET Core 应用程序发送 cookie 以调用 WCF 服务的中间件

Laravel:路由中间件和策略之间的区别

HTTP模块和OWIN中间件之间的区别

Redux中间件中的dispatch和next之间有什么区别?

ASP.NET核心中间件中Map和MapWhen分支之间的区别?

中间件取消路由之前的Silex应用程序

ExpressJS中的路由处理程序和中间件函数有什么区别?

mvc 和 api 之间的授权中间件差异

在Laravel REST应用程序中,使用中间件验证输入是否正确?

如何使用OWIN安全中间件在应用程序中设置NameClaimType

如何在Rails 4.2应用程序中添加中间件

如何在jdeveloper融合中间件应用程序中调用页面加载函数?

在 NestJS 应用程序中的 Newrelic 中注释匿名中间件

在 golang 应用程序中的任何地方使用 responsewriter - 中间件

Laravel 5.1中中间件之前和之后的区别

来自Actix Web应用程序中间件的应用程序状态访问

在Koa中,中间件中的wait next(),return await next(),return next()和next()之间有什么区别?

Dropwizard中应用程序和服务之间的区别

获取“ TypeError:必须提供秘密字符串”。在带有Passport.js和Express-Session作为中间件的NodeJS应用程序中

Express.js-Helmet.js和其他中间件以及已安装的应用程序?

部署具有MSAL和OWIN中间件的ASP.NET应用程序时出现问题

OpenId Connect中间件未在WebForms应用程序中设置身份验证cookie

Ubuntu touch中的范围和应用程序之间的区别