Eklee.Azure.Functions.GraphQl 0.2.0

There is a newer version of this package available.
See the version list below for details.
dotnet add package Eklee.Azure.Functions.GraphQl --version 0.2.0
NuGet\Install-Package Eklee.Azure.Functions.GraphQl -Version 0.2.0
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Eklee.Azure.Functions.GraphQl" Version="0.2.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Eklee.Azure.Functions.GraphQl --version 0.2.0
#r "nuget: Eklee.Azure.Functions.GraphQl, 0.2.0"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Eklee.Azure.Functions.GraphQl as a Cake Addin
#addin nuget:?package=Eklee.Azure.Functions.GraphQl&version=0.2.0

// Install Eklee.Azure.Functions.GraphQl as a Cake Tool
#tool nuget:?package=Eklee.Azure.Functions.GraphQl&version=0.2.0

Introduction

The purpose of this library is to help developers with implementing a GraphQl based Azure Function with dependency injection support.

DI Usage

In order to leverage this library, there are 3 steps. You would want to setup your DI, apply the ExecutionContextDependencyInjection attribute, and inject the ExecutionContext as a parameter in your function.

Step 1: Setup DI

The first step is to setup your DI via the Autofac Module. Be sure to register your schema using the extension method RegisterGraphQl. You can then register the types used in your schema.

using Autofac;

namespace FunctionApp1
{
    public class MyModuleConfig : Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            builder.RegisterGraphQl<BooksSchema>();
            builder.RegisterType<BooksQuery>();
            ...
        }
    }
}

Step 2/3: Setup ExecutionContextDependencyInjection attribute on said function and inject ExecutionContext.

The second step is to apply the ExecutionContextDependencyInjection on your function and tell it which Module type you would like. Next, you can inject the ExecutionContext which internally carries the function instance Id.

public static class BooksGraphFunction
{
    [ExecutionContextDependencyInjection(typeof(MyModule))]
    [FunctionName("graph")]
    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = "books/graph")] HttpRequest req,
        ILogger log,
        ExecutionContext executionContext)
    {	

Process GraphQl Request Usage:

Simply leverage the extension method ProcessGraphQlRequest.

return await executionContext.ProcessGraphQlRequest(req);

For more information about dependency injection support, visit: https://github.com/seekdavidlee/Eklee-Azure-Functions-Http

Caching Usage:

You can enable built-in caching capabilities per GraphQl best practices based on object type and instance Id. Please follow the steps below:

In your Module setup, use the extension method EnableGraphQlCache. Note that MemoryDistributedCache is just an example. In a production senario, you may choose something like Azure Redis.

builder.EnableGraphQlCache<MemoryDistributedCache>();

You can use a convention based approach to identify cache instances based on object type and instance Id by decorating with the KeyAttribute on your object type.

using System.ComponentModel.DataAnnotations;
...
    public class Book
    {
        [Key]
        public string Id { get; set; }

In your Query resolvers, you can use the extension method ResolverWithCache to create a resolver with caching support.

The first "book" query is based on the Book object type's Id property to derive "id" from the context as a key to get the instance Id value. It is cached for 10 seconds.

The second "books" query will derive "category" from the context as a key to get the instance Id value. It is cached for 10 seconds.

Once the cache expires, the respository query will be executed and persisted into the cache for the duration of time specified.

using GraphQL.Types;

namespace Eklee.Azure.Functions.GraphQl.Example.BusinessLayer
{
    public class BooksQuery : ObjectGraphType<object>
    {
        public BooksQuery(BooksRepository booksRepository, IGraphQlCache graphQlCache)
        {
            Name = "Query";

            Field<BookType>("book",
                arguments: new QueryArguments(new QueryArgument<NonNullGraphType<StringGraphType>> { Name = "id", Description = "id of the book" }),
                resolve: graphQlCache.ResolverWithCache(key => booksRepository.GetBook((string)key), 10));

            Field<ListGraphType<BookType>>("books",
                arguments: new QueryArguments(new QueryArgument<NonNullGraphType<StringGraphType>> { Name = "category", Description = "category of the book" }),
                resolve: graphQlCache.ResolverWithCache(key => booksRepository.GetBooks((string)key), 10, "category"));

        }
    }
}

Tracing support:

To enable support for tracing, please add set EnableMetrics configuration to true under GraphQl.

{
    ...
    "GraphQl": {
      "EnableMetrics": "true" 
    } 
}
Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  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. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
0.37.3 743 2/6/2021
0.36.10 955 1/31/2021
0.35.10 921 1/24/2021
0.34.6 991 1/24/2021
0.33.6 451 1/19/2021
0.32.4 557 1/10/2021
0.31.8 1,032 12/19/2020
0.30.4 966 12/8/2020
0.27.2 837 6/14/2020
0.27.1 618 4/11/2020
0.27.0 565 3/28/2020
0.26.1 693 12/22/2019
0.25.0 723 9/30/2019
0.24.9 905 9/29/2019
0.23.2 702 9/15/2019
0.22.4 682 9/8/2019
0.21.1 983 9/2/2019
0.21.0 923 8/30/2019
0.20.1 880 8/24/2019
0.20.0 834 8/18/2019
0.18.0 956 8/11/2019
0.17.0 695 8/4/2019
0.16.0 664 8/3/2019
0.15.7 797 7/26/2019
0.15.3 855 7/14/2019
0.15.2 888 7/7/2019
0.15.1 1,127 7/6/2019
0.14.1 904 6/16/2019
0.14.0 1,213 5/18/2019
0.13.1 713 3/31/2019
0.13.0 760 3/31/2019
0.12.1 975 3/24/2019
0.11.0 961 3/10/2019
0.10.0 746 3/3/2019
0.9.1 1,453 2/26/2019
0.9.0 953 2/24/2019
0.8.0 913 2/23/2019
0.7.2 979 2/20/2019
0.7.1 961 2/17/2019
0.6.3 994 2/10/2019
0.5.5 813 1/20/2019
0.5.4 800 1/13/2019
0.5.1 821 1/7/2019
0.4.6 813 12/31/2018
0.4.5 789 12/28/2018
0.4.4 977 12/27/2018
0.3.0 792 11/4/2018
0.2.0 828 11/4/2018
0.1.0 816 10/30/2018

Added support for caching and enabling tracing.