рдореБрдЭреЗ C # рдореЗрдВ рдПрдХ рдЧреНрд░рд╛рдлрдХреЙрд▓ рд╕рд░реНрд╡рд░ рд▓рд┐рдЦрд┐рдП

рдХрд┐рд╕реА рддрд░рд╣ рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрдЫ рджрд┐рди рдХреА рдЫреБрдЯреНрдЯреА рдереА, рдФрд░ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдбреЙрдХреНрд╕рд╡рд┐рдЬрди рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдЧреНрд░рд╛рдлрдХрд▓рд╛рдЗрди рд╕рд░реНрд╡рд░ рдХреЛ рд╕реНрдХреЗрдЪ рдХрд┐рдпрд╛ред рдиреАрдЪреЗ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╣реБрдЖред


рдкреЛрд╕реНрдЯрд░ - рдЗрд╢рд╛рд░реЗ рдкрд░


рдбреЙрдХреНрд╕рд╡рд┐рдЬрди рдордВрдЪ рдХреНрдпрд╛ рд╣реИ


рдбреЙрдХреНрд╕рд╡рд┐рдЬрди рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдореЗрдВ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЯреВрд▓ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдореБрдЦреНрдп рдШрдЯрдХ рдУрдЖрд░рдПрдо рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реИред рдПрдХ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд╕рдВрдкрд╛рджрдХ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдХрд╛рд░реНрдб рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдВрд░рдЪрдирд╛рддреНрдордХ, рд╕рдВрдЧреНрд░рд╣ рдФрд░ рдкреЗрдбрд╝ рдЕрдиреБрднрд╛рдЧ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╢рд┐рдХрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рдм рдХреБрдЫ рдЬрдЯрд┐рд▓ рд╣реИ ред рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рджреНрд╡рд╛рд░рд╛ рдЬрдирд░реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЖрдк рдХреБрдЫ C # API рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рд╢рдмреНрдж рдореЗрдВ - рдПрдХ рдЧреНрд░рд╛рдлрд╝рд┐рдХрд▓ рд╕рд░реНрд╡рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрджрд░реНрд╢ рд╡рд┐рдХрд▓реНрдкред


рд╡рд┐рдХрд▓реНрдк рдХреНрдпрд╛ рд╣реИрдВ


рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рд╡реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╣реИрдВред рдореИрдВ рдХреЗрд╡рд▓ рджреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЦреЛрдЬрдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛:



UPD: рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЙрдиреНрд╣реЛрдВрдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдХрд┐ рдЕрднреА рднреА рд╣реЙрдЯрдЪреИрдЪ рд╣реИ ред


README рдкрд░, рдкрд╣рд▓реЗ рддреЛ рдореБрдЭреЗ рджреВрд╕рд░рд╛ рдкрд╕рдВрдж рдЖрдпрд╛, рдФрд░ рдореИрдВрдиреЗ рднреА рдЗрд╕рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдЙрд╕реЗ рдЬрд▓реНрдж рд╣реА рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЙрд╕рдХреА рдПрдкреАрдЖрдИ рдмрд╣реБрдд рдЦрд░рд╛рдм рдереА, рдФрд░ рд╡рд╣ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд╕реНрдХреАрдо рдмрдирд╛рдиреЗ рдХреЗ рдХрд╛рдо рдХреЛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рдереАред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдПрдХ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдЖрдЦрд┐рд░реА рдкреНрд░рддрд┐рдмрджреНрдз)ред


graphql-dotnet рдПрдкреАрдЖрдИ рдХрд╛рдлреА рд▓рдЪреАрд▓рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдпрд╣ рдмрд╣реБрдд рд╣реА рдкреНрд░рд▓реЗрдЦрд┐рдд, рднреНрд░рдорд┐рдд, рдФрд░ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рд╣реИред рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ, рдореБрдЭреЗ рд╕реНрд░реЛрдд рдХреЛрдб рджреЗрдЦрдирд╛ рдерд╛ ... рд╕рдЪ рд╣реИ, рдореИрдВрдиреЗ 0.16 рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛, рдЬрдмрдХрд┐ рдЕрдм рдЕрдВрддрд┐рдо 0.17.3 , рдФрд░ 7 рдмреАрдЯрд╛ рд╕рдВрд╕реНрдХрд░рдг 2.0 рдкрд╣рд▓реЗ рд╣реА рдЬрд╛рд░реА рдХрд┐рдП рдЬрд╛ рдЪреБрдХреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЦреЗрдж рд╣реИ рдХрд┐ рдпрджрд┐ рд╕рд╛рдордЧреНрд░реА рдереЛрдбрд╝реА рдкреБрд░рд╛рдиреА рд╣реИред


рдореБрдЭреЗ рдпрд╣ рднреА рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЕрд╕рдореНрдмрджреНрдз рд╡рд┐рдзрд╛рдирд╕рднрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВред рдореБрдЭреЗ рд╕рд╛рдЗрди рдЗрди рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ ASP.NET рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реНрд░реЛрдд рд╕реЗ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рдкрдбрд╝рд╛ред


GraphQL рд╕рд░реНрд╡рд░ рд╕рдВрд░рдЪрдирд╛


рдпрджрд┐ рдЖрдк рдЧреНрд░рд╛рдлрдХреЙрд▓ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЖрдк рдЧрд┐рдЯрдм рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдереЛрдбрд╝рд╛ рд╕рд╛ рд░рд╣рд╕реНрдп - рдЖрдк рд╕реНрд╡рдд: рдкреВрд░реНрдг рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП Ctrl + рд╕реНрдерд╛рди рджрдмрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдХреНрд▓рд╛рдЗрдВрдЯ рднрд╛рдЧ рдореЗрдВ рдЧреНрд░рд╛рдлрд┐рдЗрдХреНрдпреВрдПрд▓ рд╕реЗ рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдкрдХреЗ рд╕рд░реНрд╡рд░ рдкрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдЦрд░рд╛рдм рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдмрд╕ index.html рд▓реЗрдВ , npm рдкреИрдХреЗрдЬ рд╕реЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛрдбрд╝реЗрдВ, рдФрд░ рдЕрдкрдиреЗ рд╕рд░реНрд╡рд░ рдХреЗ рдкрддреЗ рдкрд░ рдЧреНрд░рд╛рдлрдХреЙрдлрд╝реНрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ url рдмрджрд▓реЗрдВ - рдмрд╕ рдЗрддрдирд╛ рд╣реА, рдЖрдк рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВред


рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рд╢реНрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:


 query { viewer { login, company } } 

рдпрд╣рд╛рдБ рд╣рдо рдПрдХ рдлрд╝реАрд▓реНрдб рджреЗрдЦрддреЗ рд╣реИрдВ - рджрд░реНрд╢рдХ, рдЗрд╕рдореЗрдВ рд▓реЙрдЧрд┐рди, рдХрдВрдкрдиреАред рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдп, рдЧреНрд░рд╛рдлрдХреИрд▓ рдмреИрдХрдПрдВрдб рдХреА рддрд░рд╣, рд╕рд░реНрд╡рд░ рдкрд░ рдХреБрдЫ "рд╕реНрдХреАрдо" рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЗрди рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдкрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдЬрд╛рдПрдЧреАред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдлрд╝реАрд▓реНрдб рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рд╕реЗрд╡рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдПрдХ рдЙрдкрдпреБрдХреНрдд рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдореВрд▓реНрдпреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реИред


рдпреЛрдЬрдирд╛ рд╕реА # рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдХрдЯреНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдПрдВрдЧреЗ - рд╣рдо рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рд╕рдм рдХреБрдЫ рдХрд░реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдПрдХ рдбреЗрд╢рд┐рдВрдЧ рдЖрджрдореА рд╣реВрдВ, рдмрд╕ рдПрдХ рдореЗрдЯрд╛рдбреЗрдЯрд╛-рдЖрдзрд╛рд░рд┐рдд рд╕реНрдХреАрдорд╛ рдЬреЗрдирд░реЗрдЯ рдХрд░рдирд╛ рдЧреНрд░рд╛рдлрд┐рдХрд▓-рдбреЙрдЯрдиреЗрдЯ рдореЗрдВ рдПрдХ рдЧреИрд░-рдорд╛рдирдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ рдЬреЛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкреНрд░рд▓реЗрдЦрди рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред рддреЛ, рд╣рдо рдПрдХ рдЕрдирдЪрд╛рд╣реЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ, рдЙрд╕рдХреА рдЖрдВрдд рдореЗрдВ рдереЛрдбрд╝реА рдЦреБрджрд╛рдИ рдХрд░рддреЗ рд╣реИрдВред


рдпреЛрдЬрдирд╛ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рд╕рд░реНрд╡рд░ рддрдХ рдХрд┐рд╕реА рднреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЗ рд╕реЗ рдЕрдиреБрд░реЛрдз рд╕реНрдЯреНрд░рд┐рдВрдЧ (рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░) рд╡рд┐рддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИ (рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдкреЛрд╕реНрдЯ, рд╕рд┐рдЧреНрдирд▓, рдЯреАрд╕реАрдкреА ...), рдФрд░ рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рдЗрд╕рдХреЗ рдЗрдВрдЬрди рдХреЛ рдлрд╝реАрдб рдХрд░реЗрдВред рдЗрдВрдЬрди рдПрдХ рд╡рд╕реНрддреБ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓ рджреЗрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣рдо JSON рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВрдЧреЗред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рджреЗрдЦрд╛:


  //  ,        var schema = GraphQlService.GetCardsSchema(sessionContext); //    (  ) var executer = new DocumentExecuter(); //   ,  var dict = await executer.ExecuteAsync(schema, sessionContext, request.Query, request.MethodName).ConfigureAwait(false); // -   :) if (dict.Errors != null && dict.Errors.Count > 0) { throw new InvalidOperationException(dict.Errors.First().Message); } //    return Json(dict.Data); 

рдЖрдк sessionContext рдзреНрдпрд╛рди рджреЗ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╣рдорд╛рд░рд╛ рдбреЙрдХреНрд╕рд╡рд┐рдЬрди-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╕рдордп, рд╣рдо рд╣рдореЗрд╢рд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдЙрд╕ рдкрд░ рдЕрдзрд┐рдХред


рд╕рд░реНрдХрд┐рдЯ рдкреАрдврд╝реА


рдпрд╣ рд╕рдм рдПрдХ рд╕реНрдкрд░реНрд╢ рддрд░реАрдХреЗ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ:


 Schema schema = new Schema(); 

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рд╕рд░рд▓ рдХреЛрдб рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП:


  1. рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ - рдПрдХ ObjectGraphType, StringGraphType, BooleanGraphType, IdGraphType, IntGraphType, DateGraphType рдпрд╛ FloatGraphType рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдБред
  2. рдлрд╝реАрд▓реНрдб рдХреЛ рд╕реНрд╡рдпрдВ рдХрд╛ рдирд╛рдо (рдирд╛рдо, рд╣реИрдВрдбрд▓рд░) рдмрддрд╛рдПрдВ - рдПрдХ рдЧреНрд░рд╛рдлрдХреНрдпреВрдПрд▓ рдмрдирд╛рдПрдБ

рдЖрдЗрдП рдЙрд╕ рд╕рд░рд▓ рдЕрдиреБрд░реЛрдз рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдКрдкрд░ рдЙрджреНрдзреГрдд рдХрд┐рдпрд╛ рд╣реИред рдЕрдиреБрд░реЛрдз рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдлрд╝реАрд▓реНрдб рд╣реИ - рджрд░реНрд╢рдХред рдЗрд╕реЗ рдХрд┐рд╕реА рдХреНрд╡реЗрд░реА рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╕рд░рд▓ рд╣реИ - рдПрдХ рд╡рд╕реНрддреБ, рджреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде - рд▓реЙрдЧрд┐рди рдФрд░ рдХрдВрдкрдиреАред рд╣рдо рд▓реЙрдЧрд┐рди рдХреНрд╖реЗрддреНрд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ:


 var loginField = new GraphQL.Types.FieldType(); loginField.Name = "login"; loginField.ResolvedType = new StringGraphType(); loginField.Type = typeof(string); loginField.Resolver = new MyViewerLoginResolver(); // ... class MyViewerLoginResolver : GraphQL.Resolvers.IFieldResolver { public object Resolve(ResolveFieldContext context) { // ,       -   UserInfo //      viewer return (context.Source as UserInfo).AccountName; } } 

рд╣рдо рдПрдХ рд╣реА рддрд░рд╣ рд╕реЗ CompanyField рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ - рдЙрддреНрдХреГрд╖реНрдЯ, рд╣рдо рд╡реНрдпреВрдЕрд░ рдлрд╝реАрд▓реНрдб рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред


 ObjectGraphType<UserInfo> viewerType = new ObjectGraphType<UserInfo>(); viewerType.Name = "Viewer"; viewerType.AddField(loginField); viewerType.AddField(companyField); 

рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЕрдм рд╣рдо рд╕реНрд╡рдпрдВ рджрд░реНрд╢рдХ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 var viewerField = new GraphQL.Types.FieldType(); viewerField.Name = "viewer"; viewerField.ResolvedType = viewerType; viewerField.Type = typeof(UserInfo); viewerField.Resolver = new MyViewerResolver(); // ... class MyViewerResolver : GraphQL.Resolvers.IFieldResolver { public object Resolve(ResolveFieldContext context) { //     sessionContext   ? // ,         (login  company) return (context.Source as SessionContext).UserInfo; } } 

рдЦреИрд░, рдФрд░ рдЕрдВрддрд┐рдо рд╕реНрдкрд░реНрд╢, рд╣рдорд╛рд░реЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдХреНрд╡реЗрд░реА рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:


 var queryType = new ObjectGraphType(); queryType.AddField(viewerField); schema.Query = queryType; 

рдмрд╕, рд╣рдорд╛рд░реА рдпреЛрдЬрдирд╛ рддреИрдпрд╛рд░ рд╣реИред


рд╕рдВрдЧреНрд░рд╣, рдкреГрд╖реНрдард╛рдВрдХрди, рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг


рдпрджрд┐ рдлрд╝реАрд▓реНрдб рдПрдХ рд╡рд╕реНрддреБ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рд╕рдВрдкрддреНрддрд┐ рдкреНрд░рдХрд╛рд░ рдХреЛ ListGraphType рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд▓рдкреЗрдЯреЗрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЕрдЧрд░ рдХрд┐рд╕реА рджрд░реНрд╢рдХ рдиреЗ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд▓реМрдЯрд╛рдпрд╛, рддреЛ рд╣рдо рдЗрд╕реЗ рдмрд╕ рд▓рд┐рдЦреЗрдВрдЧреЗ:


 //  ( ) viewerField.ResolvedType = viewerType; //  () viewerField.ResolvedType = new ListGraphType(viewerType); 

рддрджрдиреБрд╕рд╛рд░, MyViewerResolver рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдореЗрдВ рддрдм рд╕реВрдЪреА рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ред


рдЬрдм рд╕рдВрдЧреНрд░рд╣ рдлрд╝реАрд▓реНрдб рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рддреБрд░рдВрдд рдкреЗрдЬрд┐рдВрдЧ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдпрд╣рд╛рдВ рдХреЛрдИ рддреИрдпрд╛рд░ рддрдВрддреНрд░ рдирд╣реАрдВ рд╣реИ, рд╕рдм рдХреБрдЫ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ (рдХрд╛рд░реНрдбрдХрдВрдбрд┐рд╢рди рдореЗрдВ рдПрдХ рдЖрдИрдбреА рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ)ред рдЖрдЗрдП рджрд░реНрд╢рдХ рдореЗрдВ рдРрд╕рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝реЗрдВ:


 var idArgument = new QueryArgument(typeof(IdGraphType)); idArgument.Name = "id"; idArgument.ResolvedType = new IdGraphType(); idArgument.DefaultValue = Guid.Empty; viewerField.Arguments = new QueryArguments(idArgument); 

рдлрд┐рд░ рдЖрдк рдЗрд╕ рддрд░рд╣ рд╕реЗ рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 public object Resolve(ResolveFieldContext context) { var idArgStr = context.Arguments?["id"].ToString() ?? Guid.Empty.ToString(); var idArg = Guid.Parse(idArgStr); 

GraphQL рдЗрддрдирд╛ рдЯрд╛рдЗрдкреНрдб рд╣реИ рдХрд┐ рдЧрд╛рдЗрдб, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдкрд╛рд░реНрд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЦреИрд░, рдареАрдХ рд╣реИ, рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред


рдбреЙрдХреНрд╕рд╡рд┐рдЬрди рдХрд╛рд░реНрдб рдЕрдиреБрд░реЛрдз


рдбреЙрдХреНрд╕рд╡рд┐рдЬрди рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдЧреНрд░реЗрдкрдХреНрдХреНрд▓рд╛рдЗрди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдореИрдВ рддрджрдиреБрд╕рд╛рд░ рдХреЗрд╡рд▓ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЛрдб ( sessionContext.Session.CardManager.CardTypes ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддрд╛ sessionContext.Session.CardManager.CardTypes , рдФрд░ рд╕рднреА рдХрд╛рд░реНрдбреЛрдВ рдФрд░ рдЙрдирдХреЗ рдЕрдиреБрднрд╛рдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдореИрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдХреЗ рд╕рд╛рде рдРрд╕реА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ sessionContext.Session.CardManager.CardTypes рд╣реВрдВред рдкрд░рд┐рдгрд╛рдо рдХреБрдЫ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:


 query { cardDocument(id: "{AF652E55-7BCF-E711-8308-54A05079B7BF}") { mainInfo { name instanceID } } } 

рдпрд╣рд╛рдБ cardDocument рдХрд╛рд░реНрдб рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ, mainInfo рдЗрд╕рдореЗрдВ рдЕрдиреБрднрд╛рдЧ рдХрд╛ рдирд╛рдо рд╣реИ, рдирд╛рдо рдФрд░ рдЙрджрд╛рд╣рд░рдг рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдлрд╝реАрд▓реНрдб рд╣реИрдВред рдХрд╛рд░реНрдб, рдЕрдиреБрднрд╛рдЧ рдФрд░ рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ CardManager API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:


  class CardDataResolver : GraphQL.Resolvers.IFieldResolver { public object Resolve(ResolveFieldContext context) { var sessionContext = (context.Source as SessionContext); var idArg = Guid.Parse(context.Arguments?["id"].ToString() ?? Guid.Empty.ToString()); return sessionContext.Session.CardManager.GetCardData(idArg); } } class SectionResolver : GraphQL.Resolvers.IFieldResolver { CardSection section; public SectionFieldResolver(CardSection section) { this.section = section; } public object Resolve(ResolveFieldContext context) { var idArg = Guid.Parse(context.Arguments?["id"].ToString() ?? Guid.Empty.ToString()); var skipArg = (int?)context.Arguments?["skip"] ?? 0; var takeArg = (int?)context.Arguments?["take"] ?? 15; var sectionData = (context.Source as CardData).Sections[section.Id]; return idArg == Guid.Empty ? sectionData.GetAllRows().Skip(skipArg).Take(takeArg) : new List<RowData> { sectionData.GetRow(idArg) }; } } class RowFieldResolver : GraphQL.Resolvers.IFieldResolver { Field field; public RowFieldResolver(Field field) { this.field = field; } public object Resolve(ResolveFieldContext context) { return (context.Source as RowData)[field.Alias]; } } 

рдмреЗрд╢рдХ, рдпрд╣рд╛рдВ рдЖрдк рдХреЗрд╡рд▓ рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдб рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдиреНрдирдд рд░рд┐рдкреЛрд░реНрдЯ, рд╕реЗрд╡рд╛рдУрдВ рдФрд░ рдХрд┐рд╕реА рдЕрдиреНрдп рдЪреАрдЬ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рд▓рд┐рдП рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдПрдХ рдпреЛрдЬрдирд╛ рдмрдирд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдЗрд╕ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде, рдЖрдк рдХреЗрд╡рд▓ рдЙрдЪрд┐рдд рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦрдХрд░ рдбреЙрдХреНрд╕рд╡рд┐рдЬрди рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХреЛрдИ рднреА рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдпрд╣ рдЖрдкрдХреА рд╕реНрд╡рдпрдВ рдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред


рдирд┐рд╖реНрдХрд░реНрд╖


.NET рдореЗрдВ GrapqhQL рдХреЗ рд╕рд╛рде, рдЪреАрдЬреЗрдВ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИрдВред рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╡рд┐рдХреНрд░реЗрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдФрд░ рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рд╛рде рдПрдХ рдХреБрдЫ рдЬреАрд╡рдВрдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ, рдПрдХ рдЕрд╕реНрдерд┐рд░ рдФрд░ рдЕрдЬреАрдм рдПрдкреАрдЖрдИ, рдЕрдЬреНрдЮрд╛рдд рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд▓реЛрдб рдХреЗ рддрд╣рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдЧрд╛ рдФрд░ рдпрд╣ рдХрд┐рддрдирд╛ рд╕реНрдерд┐рд░ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬреЛ рд╣реИ, рд╡рд╣ рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЦрд╛рдорд┐рдпрд╛рдВ рдФрд░ рдмрд╛рдХреА рдХреА рднрд░рдкрд╛рдИ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рдЦреБрд▓реЗрдкрди рд╕реЗ рд╣реЛрддреА рд╣реИред


рдореИрдВрдиреЗ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЬреЛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИ, рд╡рд╣ рдПрдХ рдмрдврд╝рддреА рд╣реБрдИ рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ рдПрдкреАрдЖрдИ рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЯрд╛рдЗрдк рдХрд░рдХреЗ рдФрд░ рд╕реНрд░реЛрдд рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдХреЗ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓реЗрдЦрдХреЛрдВ рдиреЗ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рд░реНрдХрд┐рдЯ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА - рдареАрдХ рд╣реИ, рдЖрдк рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рд╣реИред


рдпрд╣ рд╕рдм рд╕рдкреНрддрд╛рд╣рд╛рдВрдд рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЦреБрдж рдХреЗ рджреНрд╡рд╛рд░рд╛, рдЕрдм рддрдХ рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИред рдорд╛рдирдХ рдбреЙрдХреНрд╕рд╡рд┐рдЬрди рдкреИрдХреЗрдЬ рдореЗрдВ, рдпрд╣ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдм - рдпрд╣ рдХрд╣рдирд╛ рдЕрднреА рднреА рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдЖрдкрдХреЛ рд╕рд░реНрд╡рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдмрд┐рдирд╛ JavaScrpit рд╕реЗ рд╕реАрдзреЗ рдбреЙрдХреНрд╕рд╡рд┐рдЬрди рдбреЗрдЯрд╛рдмреЗрд╕ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИ, рддреЛ рд▓рд┐рдЦреЗрдВред рднрд╛рдЧреАрджрд╛рд░реЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рдмреНрдпрд╛рдЬ, рд╣рдо рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВрдЧреЗред

Source: https://habr.com/ru/post/hi416501/


All Articles