c# - 如何在 graphql-dotnet 中注入(inject)数据库上下文

标签 c# dependency-injection graphql-dotnet

配置服务

services.AddSingleton<IServiceProvider>(c => new FuncServiceProvider(type => c.GetRequiredService(type)));
services.AddDbContext<Context>(options => options.UseSqlServer(configuration.GetConnectionString("Default")));

services.AddSingleton<Query>();
services.AddSingleton<Schema>();

services.AddGraphQL();

配置

app.UseGraphQL<Schema>();

查询

    public class Query : ObjectGraphType
    {
        public Query(IServiceProvider resolver)
        {
            var db = resolver.GetRequiredService<Context>();

            Name = "query";
            Field<ListGraphType<Types.Note>>("notes", resolve: _ => db.Notes.AsAsyncEnumerable());
        }
    }

执行 GraphQL 端点会导致以下异常

System.InvalidOperationException: Cannot resolve scoped service 'Models.Database.Context' from root provider.

更多细节。

最佳答案

如果

QuerySchema 想要利用默认添加为作用域的 DbContext,则它也应该作用域。

services.AddDbContext<Context>(options => options.UseSqlServer(configuration.GetConnectionString("Default")));

services.AddScoped<Query>();
services.AddScoped<Schema>();

services.AddGraphQL()
    .AddGraphTypes(ServiceLifetime.Scoped);;

Context 应该显式注入(inject)

public class Query : ObjectGraphType {
    public Query(Context db) {
        Name = "query";
        Field<ListGraphType<Types.Note>>("notes", resolve: _ => db.Notes.AsAsyncEnumerable());
    }
}

关于c# - 如何在 graphql-dotnet 中注入(inject)数据库上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58509238/

相关文章:

c# - 注入(inject)具有构造函数依赖项的记录器

c# - 是否保证多个 ninject 绑定(bind)保持其绑定(bind)顺序

asp.net-core - 如何在 ASP.NET Core GraphQL 中访问嵌套字段中的参数

c# - 无法从程序集 'GraphQL.Http.IDocumentWriter' 加载类型 'GraphQL, Version=3.0.0.0, Culture=neutral, PublicKeyToken=null'

c# - Microsoft MessageQueue Formatter 属性始终为空

c# - + 在正则表达式中

c# - C# .Net 中 XmlElement 中的空白

c# - 如何在 LINQ 连接中使用 AND

javascript - Javascript中是否有依赖注入(inject)容器的意义?

c# - GraphQL 对 JWT 字段进行身份验证的问题