ASP.NET Core中使用GraphQL

  • ASP.NET Core中使用GraphQL - 第一章 Hello World
  • ASP.NET Core中使用GraphQL - 第二章 中间件

SOLID原则中的D表示依赖倒置原则。这个原则的内容是:

  • 上层模块不应该直接依赖底层模块,而应该依赖其抽象
  • 抽象不应该依赖于细节, 细节应该依赖抽象

来源:WIKIPEDIA

在一个模块中创建一个其他模块的实例会导致这个模块与其他模块之间的紧耦合。 为了让不同的模块解耦,我们需要遵循依赖倒置原则。按照这种原则,一个模块不会依赖于其他模块的实现,会依赖于其他模块的抽象,例如接口。

一个抽象会存在许多个实现。无论何时我们碰到一个抽象,我们都需要传递一个该抽象的实现。所以我们需要一个类来负责配置他们之间的映射,这里我们称这个类为依赖注入容器(dependency injection container)。

ASP.NET Core中已经内置了一个依赖注入容器。它使用起来非常简单。它不仅能够配置抽象接口与实现类之间的映射,还可以配置实现类实例的生命周期。

在我们之前的Hello World项目中,我们没有关注过实例的生命周期。到目前为止,我们会将所有实现类对象设置为了Singleton

这里我们首先需要解除对DocumentWriterDocumentExecuter类依赖。方法就是使用抽象接口IDocumentWriterIDocumentExecuter替换DocumentWriterDocumentExecuter

public void ConfigureServices(IServiceCollection services)
{services.AddSingleton<IDocumentWriter, DocumentWriter>();services.AddSingleton<IDocumentExecuter, DocumentExecuter>();
}

对于HelloWorldQuery实例,我们没有编写任何抽象接口,所以这里我们简单的使用了其原始实现。

services.AddSingleton<HelloWorldQuery>(); 

当前的结构(Schema)中包含了一个query, 在后续的博文中我们还会添加mutation和其他字段,所以这里我们最好创建一个独立的类来设置它。所以这里我们创建了一个HelloWorldSchema类,它继承自Schema, 并在构造中注入了一个HelloWorldQuery实例。

public class HelloWorldSchema : Schema
{public HelloWorldSchema(HelloWorldQuery query){Query = query;}
}

最后我们在Startup.cs文件的Configure方法中注入HelloWorldSchame

services.AddSingleton<ISchema, HelloWorldSchema>();  

TIPS:ISchemagraphql-dotnet库中一个接口,Schema类实现了ISchema接口

现在我们将之前创建的中间件移到一个单独的类中,我们将它命名为GraphQLMiddleware, 其代码如下。

public class GraphQLMiddleware
{private readonly RequestDelegate _next;private readonly IDocumentWriter _writer;private readonly IDocumentExecuter _executor;private readonly ISchema _schema;public GraphQLMiddleware(RequestDelegate next, IDocumentWriter writer, IDocumentExecuter executor, ISchema schema){_next = next;_writer = writer;_executor = executor;_schema = schema;}public async Task InvokeAsync(HttpContext httpContext){if (httpContext.Request.Path.StartsWithSegments("/api/graphql") && string.Equals(httpContext.Request.Method, "POST", StringComparison.OrdinalIgnoreCase)){string body;using (var streamReader = new StreamReader(httpContext.Request.Body)){body = await streamReader.ReadToEndAsync();var request = JsonConvert.DeserializeObject<GraphQLRequest>(body);var result = await _executor.ExecuteAsync(doc =>{doc.Schema = _schema;doc.Query = request.Query;}).ConfigureAwait(false);var json = await _writer.WriteToStringAsync(result);await httpContext.Response.WriteAsync(json);}}else{await _next(httpContext);}}
}

这里你会注意到我们是如何使用抽象接口来解耦的,在GraphQLMiddleware的构造函数中,我们注入了当前中间件所需的所有服务IDocumentWriter, IDocumentExecuter, 以及ISchema

最后我们需要将这个中间件注册到应用程序管道中。IApplicationBuilder接口提供了一个扩展方法UseMiddleware, 我们可以使用它来注册中间件。所以最终Configure方法中的代码如下:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{app.UseMiddleware<GraphQLMiddleware>();
}

现在我们重新使用POSTMAN来测试。

结果正确输出了。

本文源代码:https://github.com/lamondlu/GraphQL_Blogs/tree/master/Part%20III

转载于:https://www.cnblogs.com/lwqlun/p/9918006.html

ASP.NET Core中使用GraphQL - 第三章 依赖注入相关推荐

  1. ASP.NET Core中使用GraphQL - 第七章 Mutation

    ASP.NET Core中使用GraphQL - 目录 ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间 ...

  2. ASP.NET Core 中文文档 第三章 原理(5)错误处理

    原文:Error Handling 作者:Steve Smith 翻译:谢炀(Kiler) 校对:高嵩(jack2gs).何镇汐 当你的ASP.NET应用发生错误的时候, 你可以采用本文所述的各种方法 ...

  3. ASP.NET Core 中文文档 第三章 原理(3)静态文件处理

    原文:Working with Static Files 作者:Rick Anderson 翻译:刘怡(AlexLEWIS) 校对:谢炀(kiler398).许登洋(Seay).孟帅洋(书缘) 静态文 ...

  4. ASP.NET Core 中文文档 第三章 原理(13)管理应用程序状态

    原文:Managing Application State 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:高嵩 在 ASP.NET Core 中,有多种途径可以对应用程序的状态进行 ...

  5. ASP.NET Core 中文文档 第三章 原理(1)应用程序启动

    原文:Application Startup 作者:Steve Smith 翻译:刘怡(AlexLEWIS) 校对:谢炀(kiler398).许登洋(Seay) ASP.NET Core 为你的应用程 ...

  6. ASP.NET Core 中文文档 第三章 原理(12)托管

    原文:Hosting 作者:Steve Smith 翻译:娄宇(Lyrics) 校对:何镇汐.许登洋(Seay) 为了运行 ASP.NET Core 应用程序,你需要使用 WebHostBuilder ...

  7. ASP.NET Core 中文文档 第三章 原理(2)中间件

    原文:Middleware 作者:Steve Smith and Rick Anderson 翻译:刘怡(AlexLEWIS) 校对:许登洋(Seay) 章节: 什么是中间件 用 IApplicati ...

  8. ASP.NET Core中使用GraphQL - 最终章 Data Loader

    ASP.NET Core中使用GraphQL - 目录 ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间 ...

  9. ASP.NET Core中使用GraphQL - 第二章 中间件

    前文:ASP.NET Core中使用GraphQL - 第一章 Hello World 中间件 如果你熟悉ASP.NET Core的中间件,你可能会注意到之前的博客中我们已经使用了一个中间件, 这个中 ...

最新文章

  1. Debian 6 7 8 utc时间设置
  2. 7999元大疆最新无人机,支持第一人称视角极速拍摄,网友:不是航拍,是直接起飞...
  3. 在word中插入目录
  4. Android 应用中十大常见 UX 错误
  5. 如何选择python书籍_关于 Python 的经典入门书籍有哪些?
  6. 【Python】一种pyahocorasick库安装方法
  7. Junit源码阅读(四)之自定义扩展
  8. 不重复地输出数(信息学奥赛一本通-T1245)
  9. 华为平板matepad pro鸿蒙,华为MatePad Pro 2平板电脑入网:首款预装鸿蒙OS
  10. Android入门学习2
  11. 正确使用auto_ptr智能指针
  12. PMBOK--项目整合管理
  13. 小米笔记本电脑键盘卡键维修
  14. 一起学 Unix 环境高级编程 (APUE) 之 信号
  15. oracle solaris翻译,详解Oracle云操作系统Solaris 11.2
  16. java 多音词语转拼音_py4j汉语转拼音多音字处理
  17. 昆山花桥房都要上万 上海买家占9成“江山”
  18. 10大程序员必逛网站,良心推荐,建议收藏!
  19. HAL库配置STM32F1系列定时器驱动步进电机(三)
  20. 鸿蒙跨屏流转是什么,华为智慧屏SE系列评测:从用上到爱上 就是一“眼”之间...

热门文章

  1. php页面添加js判断语句,JavaScript中if条件语句怎么使用
  2. Golang Post传参调用示例
  3. PHP socket初探 --- 一些零碎细节的拾漏补缺
  4. laravel实现第三方qq一键登录
  5. [android] 与PHP的session进行交互demo
  6. Batch Normailzation
  7. 读取excel并将其转换为xml
  8. 古老的话题:成本控制
  9. c++ 字典_再来瞄一眼字典与集合?
  10. equinox_轻松使用Linux Equinox桌面环境