虽然有约定方法,但有时候我们在开发的时候往往会犯迷糊,想不起来到底是什么样的约定,所以,在这里我们可以定义一个抽象基类,然后以后所有的Middleware在定义的时候都继承该抽象类并重载Invoke方法即可,从而可以避免约定忘记的问题。代码如下:
/// <summary> /// 抽象基类 /// </summary> public abstract class AbstractMiddleware { protected RequestDelegate Next { get; set; } protected AbstractMiddleware(RequestDelegate next) { this.Next = next; } public abstract Task Invoke(HttpContext context); } /// <summary> /// 示例Middleware /// </summary> public class DemoMiddleware : AbstractMiddleware { public DemoMiddleware(RequestDelegate next) : base(next) { } public async override Task Invoke(HttpContext context) { Console.WriteLine("DemoMiddleware Start."); await Next.Invoke(context); Console.WriteLine("DemoMiddleware End."); } }
使用方法和上面的一样。
终止链式调用或阻止所有的Middleware
在有些情况下,当然根据某些条件判断以后,可能不在需要继续往下执行下去了,而是想知己诶返回结果,那么你可以在你的Middleware里忽略对await next.Invoke(content);的调用,直接使用·Response.WriteAsync·方法输出内容。
另外,在有些情况下,你可能需要实现类似之前版本中的handler的功能,即不经常任何Pipeline直接对Response进行响应,新版ASP.NET里提供了一个run方法用于实现该功能,只需要在Configure方法里调用如下代码即可实现类似的内容输出。
app.Run(async context => { context.Response.ContentType = "text/html"; await context.Response.WriteAsync("Hello World!"); });
关于ASP.NET 5 Runtime的内容,请访问:https://msdn.microsoft.com/en-us/magazine/dn913182.aspx
遗留问题
在Mvc项目中,所有的依赖注入类型都是通过IServiceProvider实例来获取的,目前可以通过以下形式获取该实例:
var services = Context.RequestServices; // Controller中 var services = app.ApplicationServices; // Startup中
获取了该实例以后,即可通过如下方法来获取某个类型的对象:
var controller = (AccountController)services.GetService(typeof(AccountController)); // 要判断获取到的对象是否为null
如果你引用了Microsoft.Framework.DependencyInjection命名空间的话,还可以使用如下三种扩展方法:
var controller2 = (AccountController)services.GetService<AccountController>(); // 要判断获取到的对象是否为null //如下两种方式,如果获取到的AccountController实例为null的话,就会字段抛异常,而不是返回null var controller3 = (AccountController)services.GetRequiredService(typeof(AccountController)); var controller4 = (AccountController)services.GetRequiredService<AccountController>();
那么问题来了?如何不在Startup和Controller里就可以获取到HttpContext和IApplicationBuilder实例以便使用这些依赖注入服务?
如何获取IApplicationBuilder实例?
答案:在Startup里将IApplicationBuilder实例保存在一个单例中的变量上,后期全站就可以使用了。
如何获取HttpContext实例?
答案:参考依赖注入章节的普通类的依赖注入
您可能感兴趣的文章: