飞雪团队

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4955|回复: 0

使用Hot Chocolate和.NET 6构建GraphQL应用(8) —— 实现Mutate添加数据 ...

[复制链接]

5744

主题

5832

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
19556
发表于 2022-2-12 14:35:41 | 显示全部楼层 |阅读模式
4 ~# }: u$ H7 v8 S/ Z& y+ l
<h2 id="系列导航">系列导航</h2>% _$ t& u# R, g* z; W+ |4 L
<p><a  href="https://www.cnblogs.com/code4nothing/p/graphql-net6-0.html">使用Hot Chocolate和.NET 6构建GraphQL应用文章索引</a></p>5 `) E& Y" m7 c6 V3 r
<h2 id="需求">需求</h2>
1 e$ [) r, i$ o* c  O( w1 g<p>在讨论完GraphQL中的查询需求后,这篇文章我们将演示如何实现GraphQL中的数据添加任务。</p>
( a& H$ l9 k  ~0 v7 h+ v0 A<h2 id="思路">思路</h2>
" u/ {- Q4 H6 d5 i1 E<p>在GraphQL中,对数据进行查询使用<code>query</code>,而对于修改数据则需要使用<code>mutation</code>,包括新增和修改数据。Hot Chocolate在使用Mutation的逻辑上和使用Query的基本一致,但是需要根据需要定义用于创建或者更新的数据对象,所以我们直接进行实现。</p># L9 Q  c; y  n
<h2 id="实现">实现</h2>
8 {% F8 v/ _, @7 e" B<p>为了保持简单,我们先定义以下两个类型:</p>, J! c5 f, f' Y( C$ m
<pre><code class="language-c#">// 定义新增Post的参数, [. r: ~8 T, I1 V! N
public record AddPostInput(string Title, string Author);
. w& ], x8 M/ b* J* ~; k" z+ `, z
( P7 Z( o; g7 W9 O  f" c// 定义新增Post的返回对象
5 v3 V2 k: q4 F" `public record AddPostPayload(Post Post);
: \' X+ |. t# m# I</code></pre>/ b. m4 r" q' X3 `! D& W
<p>新建<code>Mutation.cs</code>用来定义相关接口:</p>
) q9 \: B3 U/ U3 D6 t; h( N4 H* n<ul>4 h7 b8 j1 V' V7 \' P' Z
<li><code>Mutation.cs</code></li>
/ X  x9 h" d- y9 `# y: p</ul>
) ~- u  H7 K& p9 _<pre><code class="language-c#">namespace PostGraphi.Api.GraphQL;
3 ^+ M% |# q) T0 L! `7 s/ S0 t, J7 R. J0 S5 V0 w3 V
public class Mutation
2 w+ M; H8 I' c8 a{
7 Y# [! {. B) c2 ^8 {) J" _; y6 `    public async Task&lt;AddPostPayload&gt; AddPostAsync(AddPostInput input, [Service] IRepository&lt;Post&gt; repository)
& ?4 l  k6 `! f    {  I' w3 C' f2 s9 k8 }. k2 @
        return new AddPostPayload(await repository.AddAsync(new Post
! z6 t5 [( l# ?$ X7 J+ Q/ Z6 j        {
" Q5 |  v7 c8 E. B8 q5 u            Title = input.Title,
! ~" g6 Q' Q  y* x4 A            Author = input.Author3 a( V& P; `0 i' c+ C0 \
        }));1 C0 g/ O+ W5 q7 ]1 x. ?* ?
    }; g' B5 [" V# G+ E' X
}1 Q3 w5 \$ E! ~8 X

% `7 `3 g; a1 L* C</code></pre>
. W4 o$ F" n$ T' w/ z4 v& `6 R1 k6 O( D<p>最后在注入服务的地方进行配置:</p>
4 V) a% t, O' l% |* u  L4 R& Q<ul>. i  I; N0 G, Y
<li><code>ProgramExtensions.cs</code></li>
8 I: w' P' \3 q4 a  ^& q7 \. {</ul>
! R4 a- R; s1 z3 x) Q9 [8 Y5 n' T<pre><code class="language-c#">builder.Services
- {/ a" \" N9 v: i9 C" B+ U    .AddGraphQLServer()
' s- t! ?& o" z: G& N7 B' J  k    .SetPagingOptions(new PagingOptions
# S  @( j7 o0 l) v, K3 x& T/ T    {
! c) i/ k# D, `- V        MaxPageSize = 50,
3 U) A4 b; n+ r7 a1 P& ^        IncludeTotalCount = true
, `9 ^/ h# N$ J4 ]! L    })6 C+ }. i& O2 s5 }8 Y% U5 S" J  D+ n
    .AddFiltering()
3 y5 o$ E+ @$ y) d9 h    .AddProjections()+ K, |' g  Z' O: L9 s
    .AddSorting()
! @4 I/ `& V* f& Q3 p    .AddQueryType&lt;Query&gt;()
  ^4 k- X! S% g# K5 J% r- z' ~3 J    .AddMutationType&lt;Mutation&gt;(): |" m. K+ z8 v$ t
    .AddMutationConventions(new MutationConventionOptions
- M% v8 Z- Z; v5 ~& K0 J    {6 J- Q% k/ y: K
        ApplyToAllMutations = true,
. ~5 O1 A! N. T, C, h        InputArgumentName = "input",
8 i, e$ f& \8 d0 X        InputTypeNamePattern = "{MutationName}Input",
  J  O+ T# Z9 s- ^( k        PayloadTypeNamePattern = "{MutationName}Payload",
3 d' Y1 {0 V) Y! G; M        PayloadErrorTypeNamePattern = "{MutationName}Error",8 H/ [- a  S# q; p$ L4 x3 J: Q+ x: j, s- Y
        PayloadErrorsFieldName = "errors"
( I5 K4 k3 B) w9 `0 _- W    })
  G; \: v! \2 P" k4 ?# m; R6 i" g8 a    .AddType&lt;PostType&gt;();" F) e/ d" C1 H4 H- N0 M- ^
</code></pre>
: m! b, }+ ?+ }- U- g<p>这样就实现了新增Post的需求,下面我们来验证一下。</p>
  q) \4 N4 P' f  P% j<h2 id="验证">验证</h2>
# O* r8 y7 c3 B) q, I6 A6 R: t<p>启动<code>Api</code>项目,调用接口:</p>
+ x" J, v& V, x6 m<p><img src="https://img2022.cnblogs.com/blog/2487237/202202/2487237-20220211104544617-1400586374.png" ></p>
' O0 U3 j: Y* x7 s5 F<p>终端的日志输出如下:</p>5 Y" e. A2 ^! k
<pre><code class="language-bash">[10:45:15 INF] Executed DbCommand (1ms) [Parameters=[@p0='?' (DbType = Guid), @p1='?', @p2='?' (Size = 13), @p3='?', @p4='?' (DbType = DateTime), @p5='?', @p6='?' (DbType = DateTime), @p7='?', @p8='?', @p9='?' (DbType = DateTime), @p10='?' (Size = 30)], CommandType='Text', CommandTimeout='30']
0 E) b+ N: h0 E- s+ t1 [) n  j2 S9 WINSERT INTO "Posts" ("Id", "Abstraction", "Author", "Content", "Created", "CreatedBy", "LastModified", "LastModifiedBy", "Link", "PublishedAt", "Title")
, i% r( h# z5 WVALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9, @p10);4 `5 H, V/ I( P' Z0 _
[10:45:15 INF] Executed endpoint 'Hot Chocolate GraphQL Pipeline'. N+ y  m/ y) j9 K: d6 [9 o8 V1 t' z
</code></pre>7 R  w  N( u4 m, |7 L5 L2 {
<p>可以看到新建的Post已经存储到数据库中了,我们可以通过查询接口来获取详情:</p>1 }& ]" E. B: `" L$ c
<p><img src="https://img2022.cnblogs.com/blog/2487237/202202/2487237-20220211104851825-1533915064.png" ></p>! g0 {2 {( }' f
<h2 id="总结">总结</h2>. t3 M( |: x* @. m* q1 s
<p>在本文中我们实现了简单的新增Post操作,这里还有一些涉及到错误处理的内容,我没有在文章中演示,可以参考官方文档 <a  href="https://chillicream.com/docs/hotchocolate/defining-a-schema/mutations/#errors">Errors</a>,在自定义异常对象后,有三种方式可以进行错误处理:直接返回异常;使用异常工厂方法;使用构造函数。甚至可以在<code>AggregateExceptions</code>中一次性返回多个异常。基本思路都是通过添加属性<code>[Error(typeof(SomeUserDefinedException))]</code>来实现的。</p>
* c9 f8 Z9 ^8 k5 b% R3 s1 m# x<p>在下一篇文章中,我们通过<code>Mutation</code>对已有数据进行更新。</p>
9 f; b8 `5 g1 g* {$ h! K
! V$ u6 u2 o6 R
回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|飞雪团队

GMT+8, 2025-1-25 12:14 , Processed in 0.064174 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表