DotNetBrightener.Integration.GraphQL
1.0.0-beta-007
dotnet add package DotNetBrightener.Integration.GraphQL --version 1.0.0-beta-007
NuGet\Install-Package DotNetBrightener.Integration.GraphQL -Version 1.0.0-beta-007
<PackageReference Include="DotNetBrightener.Integration.GraphQL" Version="1.0.0-beta-007" />
paket add DotNetBrightener.Integration.GraphQL --version 1.0.0-beta-007
#r "nuget: DotNetBrightener.Integration.GraphQL, 1.0.0-beta-007"
// Install DotNetBrightener.Integration.GraphQL as a Cake Addin #addin nuget:?package=DotNetBrightener.Integration.GraphQL&version=1.0.0-beta-007&prerelease // Install DotNetBrightener.Integration.GraphQL as a Cake Tool #tool nuget:?package=DotNetBrightener.Integration.GraphQL&version=1.0.0-beta-007&prerelease
GraphQL Integration
DotNetBrightener.Integration.GraphQL is a library that provides APIs to integrate with GraphQL in your Asp.Net Core project with the MVC / Web.API-like style. You will define your GraphQL APIs into controllers / actions and it will just work.
If you are not familar with GraphQL, check out https://github.com/facebook/graphql and https://graphql-dotnet.github.io/docs/getting-started
Feature:
- WebAPI-like approach of implementing GraphQL
- Modular, only depends on GraphQL DotNet library
Installation
You can install the library from Nuget Package Management on Visual Studio. Require .Net 5.0. Follow instructions on https://www.nuget.org/packages/DotNetBrightener.Integration.GraphQL for installation options.
Additionally you can download the package and manually reference its dll into your application. You will need to install the dependencies as listed on the Nuget package page
Usage
<a name="configuration-startup"></a>1. Register GraphQL Integration to IServiceCollection
In your Startup.cs
's ConfigureService(IServiceCollection services)
method, add the following:
// add this using to the using section
using DotNetBrightener.Integration.GraphQL.Extensions;
// ... omitted code
public void ConfigureServices(IServiceCollection services)
{
// ... omitted codes
// adds GraphQL services
services.EnableGraphQL();
}
If you have your graph types in the same assembly as Startup
class, the above code will automatically register all the types.
Otherwise, assuming you have defined the graph types/queries/mutations (described in Define your models section below) in a separate assembly, then add the reference to that assembly and use the following to register your graph types.
var assembly = typeof(YourGraphType).Assembly;
services.AddGraphTypes(assembly);
2. Register GraphQL Integration Middleware
In your Startup.Configure()
method, add the following to register the middleware to your application
var graphQLEndpoint = "/[your-desired-endpoint]"; // default is /graphql if you don't specify
var enablePlayground = true; // true to enable UI Playground, false to disable it. Default to true if you don't specify
app.UseGraphQLIntegration(graphQLEndpoint, enablePlayground);
<a name="define-model"></a>3. Define your models (GraphType
s and InputType
s)
ViewModel is a GraphType
that exposes your model to the GraphQL queries. InputModel is InputGraphType
that receives your input data from client into the GraphQL mutations.
Given you have an entity defined as the following:
public class User
{
[Key]
public long Id { get; set; }
public string UserName { get; set; }
[JsonIgnore] // properties marked with this attribute will not be indexed and returned from the GraphQL API
public string HashPassword { get; set; }
[NotMapped] // properties marked with this attribute will not be indexed and returned from the GraphQL API
public string SomeNotMappedProperty { get; set; }
}
You can define ViewModel as the following:
public class UserViewModel: BaseGraphQLViewModel<User> { } // this is minimal set up
All fields defined in your entity class will be defined automatically to the view model, except fields / properties that are marked with the following attributes: [JsonIgnore]
, [NotMapped]
, or virtual properties (which we usually use for navigation properties in Entity Framework)
If you want to expose more information into the output of UserViewModel when requested, you can use GraphQLProperty
to do this.
public class UserViewModel: BaseGraphQLViewModel<User>
{
private readonly ISomeService _yourServiceToResolveProperties;
// you can use DependencyInjection here
public UserViewModel(ISomeService yourService)
{
_yourServiceToResolveProperties = yourService;
}
// ... omitted code
// retrieve the user groups information from the user view model, if the client side wants to
[GraphQLProperty("userGroups", typeof(ListGraphType<UserGroupModel>))]
public IEnumerable<UserGroup> GetUserGroups(IResolveFieldContext<User> context)
{
// IResolveFieldContext<User> context is required to access which user information you are looking at
var userId = context.Source.Id; // context.Source is the resolved User object, so you can access its data
var userGroups = _yourServiceToResolveProperties.GetGroupsUserBelongsTo(userId);
return userGroups;
}
} // this is complex set up
You also can define InputModel as following:
public class UserInputModel: BaseGraphQLInputModel<User> { }
To prevent unexpected behaviour, InputModel
s ignore the fields you mark as Id / Key in the entity class.
For more information about GraphType
and InputType
, check out the GraphQL documentation.
4. Populate your API as query or mutation
Now that you have ViewModel
and InputModel
set up, you can wire them up into Queries and Mutations via controller.
Define your query controller as the following
public class UserQueries : GraphQLController, IGraphQueriesRegistration
{
// expose the method as query { users($includeDeleted: BooleanGraphType) { [...fields to pick up] } }
[GraphQLMethod("users", typeof(ListGraphType<UserViewModel>))]
public async Task<IEnumerable<User>> GetUsers(bool includeDeleted = false)
{
// your logics go here
return users;
}
}
Define your mutation controller as the following
public class UserMutations : GraphQLController, IGraphMutationsRegistration
{
// expose the method as mutation { updateUser($userId: longGraphType, $user: UserInputModel) { [...fields to pick up from result] } }
[GraphQLMethod("updateUser", typeof(UserViewModel))]
public async Task<User> GetUsers(long userId, User user)
{
// your logic to update user goes here
return user;
}
}
Controllers which implement IGraphQueriesRegistration
and IGraphMutationsRegistration
are automatically registered when you use the services.AddGraphTypes(typeof(YourGraphType).Assembly)
as described in the Register GraphQL Integration to IServiceCollection section
5. Secure your API
Your APIs (queries and mutations) signatures will be public anyway in the UI Playground if you decide to use it. However, in order to execute a specific query or mutation, if authentication is required, you can add [Authorize]
attribute to the method which you want to populate as a query or mutation. User will need to be authenticated in order to perform the query.
In some case, you would like to apply authorization, you can use the ASP.Net MVC approach of authorizing the user to meet certain requirement by using IAuthorizationService
.AuthorizeAsync()
built-in method, or you can implement one for your project's need.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 is compatible. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
-
net5.0
- GraphQL (>= 3.2.0)
- GraphQL.Server.Transports.AspNetCore (>= 4.4.0)
- GraphQL.Server.Transports.AspNetCore.SystemTextJson (>= 4.4.0)
- GraphQL.Server.Ui.Playground (>= 4.4.0)
- System.Linq.Dynamic.Core (>= 1.2.6)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on DotNetBrightener.Integration.GraphQL:
Package | Downloads |
---|---|
WebEdFramework
The based library for Modules to be built and run with WebEd CMS or any applications that are based on WebEd Framework |
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|
* v1.0.0-beta-007:
- Added support to use [Authorize] on the GraphQLMethod for authorization purpose.