ASP.NET Core中使用GraphQL - 第三章 依赖注入
2019-01-24 07:11
666 查看
ASP.NET Core中使用GraphQL
SOLID原则中的D表示依赖倒置原则。这个原则的内容是:
- 上层模块不应该直接依赖底层模块,而应该依赖其抽象
- 抽象不应该依赖于细节, 细节应该依赖抽象
来源:WIKIPEDIA
在一个模块中创建一个其他模块的实例会导致这个模块与其他模块之间的紧耦合。 为了让不同的模块解耦,我们需要遵循依赖倒置原则。按照这种原则,一个模块不会依赖于其他模块的实现,会依赖于其他模块的抽象,例如接口。
一个抽象会存在许多个实现。无论何时我们碰到一个抽象,我们都需要传递一个该抽象的实现。所以我们需要一个类来负责配置他们之间的映射,这里我们称这个类为依赖注入容器(dependency injection container)。
ASP.NET Core中已经内置了一个依赖注入容器。它使用起来非常简单。它不仅能够配置抽象接口与实现类之间的映射,还可以配置实现类实例的生命周期。
在我们之前的Hello World项目中,我们没有关注过实例的生命周期。到目前为止,我们会将所有实现类对象设置为了
Singleton。
这里我们首先需要解除对
DocumentWriter和
DocumentExecuter类依赖。方法就是使用抽象接口
IDocumentWriter和
IDocumentExecuter替换
DocumentWriter和
DocumentExecuter。
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:
ISchema是graphql-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 = _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
相关文章推荐
- ASP.NET Core中使用GraphQL - 第三章 依赖注入
- ASP.NET Core依赖注入解读&使用Autofac替代实现
- ADO.NET .net core2.0添加json文件并转化成类注入控制器使用 简单了解 iTextSharp实现HTML to PDF ASP.NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下 C# AutoMapper 了解一下
- 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(六)-- 依赖注入
- ASP.NET Core依赖注入解读&使用Autofac替代实现
- 使用依赖关系注入在 ASP.NET Core 中编写干净代码
- [转]使用依赖关系注入在 ASP.NET Core 中编写干净代码
- ASP.NET Core 新建线程中使用依赖注入的问题
- asp.net core-9.依赖注入的使用
- ASP.NET Core依赖注入解读&使用Autofac替代实现
- ASP.NET Core中使用自定义MVC过滤器属性的依赖注入
- ASP.NET Core2使用Autofac实现IOC依赖注入竟然能如此的优雅简便
- ASP.NET Core 中文文档 第三章 原理(10)依赖注入
- ASP.NET - 使用依赖关系注入在 ASP.NET Core 中编写干净代码
- [翻译]在ASP.NET MVC中使用TDD与依赖注入
- asp.net mvc Autofac 依赖注入框架 使用
- ASP.NET Core 2.0 依赖注入
- 【无私分享:ASP.NET CORE 项目实战(第二章)】添加EF上下文对象,添加接口、实现类以及无处不在的依赖注入(DI)
- ASP.NET Core 在 JSON 文件中配置依赖注入
- [译]ASP.NET Core 2.0 依赖注入