多个程序集中的GraphQL OjectGraphTypes时,依赖项注入将不起作用

我在几个项目中定义了几个GraphQL ObjectGraphType和查询。所有这些项目都依赖于asp.net样板GraphQL项目。当我尝试调用任何graphQL查询时,它返回错误“ Castle.microKernel.ComponentNotFoundException:”未找到支持该服务的组件“

异常堆栈跟踪

Sample.Types.ProductPagedResultGraphType was found ---> Castle.microKernel.ComponentNotFoundException: No component for supporting the service Sample.Types.ProductPagedResultGraphType was found
   at Castle.microKernel.DefaultKernel.Castle.microKernel.IKernelInternal.Resolve(Type service,Arguments arguments,IReleasePolicy policy,Boolean ignoreParentContext)
   at Castle.Windsor.MsDependencyInjection.ScopedwindsorServiceProvider.GetServiceInternal(Type serviceType,Boolean isOptional) in D:\Github\castle-windsor-ms-adapter\src\Castle.Windsor.MsDependencyInjection\ScopedwindsorServiceProvider.cs:line 55
   at GraphQL.Types.Schema.<CreateTypesLookup>b__56_2(Type type)
   at GraphQL.Types.GraphTypesLookup.AddTypeIfNotRegistered(Type type,TypeCollectionContext context)
   at GraphQL.Types.GraphTypesLookup.HandleField(Type parentType,FieldType field,TypeCollectionContext context)
   at GraphQL.Types.GraphTypesLookup.AddType(IGraphType type,TypeCollectionContext context)
   at GraphQL.Types.GraphTypesLookup.Create(IEnumerable`1 types,IEnumerable`1 directives,Func`2 resolveType,IFieldNameConverter fieldNameConverter)
   at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode)
   at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication,Boolean useDefaultConstructor)
   at System.Lazy`1.CreateValue()
   at GraphQL.Types.Schema.get_AllTypes()
   at GraphQL.Instrumentation.FieldMiddlewareBuilder.ApplyTo(ISchema schema)
   at GraphQL.DocumentExecuter.ExecuteAsync(ExecutionOptions options)
   --- End of inner exception stack trace ---

当所有这些查询和ObjectGraphType都在1个项目(即asp.net样板GraphQL项目)中时,它可以工作。

为了允许GraphQL ObjectGraphType和查询在多个项目中而不是全部放入asp.net样板GraphQL项目中,我进行了以下更改:

  1. 我创建了一个新的QueryContainer(ExtQueryContainer.cs),以扩展原始的QueryContainer.cs
  2. 我已通过从类中删除sealed关键字来修改原始QueryContainer,以允许新创建的QueryContainer继承原始QueryContainer。
  3. 我创建了一个新的GraphQL模式(GraphQLSchema.cs),该模式引用了新创建的ExtQueryContainer

ServiceCollectionExtensions.cs(在asp.net样板GraphQL项目中)

public static class ServiceCollectionExtensions
{
    public static void AddAndConfigureGraphQL(this IServiceCollection services)
    {
        services.AddScoped<IDependencyResolver>(
            x => new FuncDependencyResolver(x.GetRequiredService)
        );

        services
            .AddGraphQL(x => { x.ExposeExceptions = DebugHelper.IsDebug; })
            .AddGraphTypes(ServiceLifetime.Scoped)
            .AddUserContextBuilder(httpContext => httpContext.User)
            .AddDataLoader();
    }
}

ExtQueryContainer.cs

public sealed class ExtQueryContainer : QueryContainer
{
    public QueryContainer(RoleQuery roleQuery,UserQuery userQuery,OrganizationUnitQuery organizationUnitQuery,ProductQuery productQuery)
        : base(roleQuery,userQuery,organizationUnitQuery)
    {
        AddField(productQuery.GetFieldType());
    }
}

GraphQLSchema.cs

public class GraphQLSchema : Schema,ITransientDependency
{
    public GraphQLSchema(IDependencyResolver resolver) : base(resolver)
    {
        Query = resolver.Resolve<ExtQueryContainer>();
    }
}
ooygg 回答:多个程序集中的GraphQL OjectGraphTypes时,依赖项注入将不起作用

您需要为每个程序集调用AddGraphTypes

var productGraphAssembly = Assembly.GetAssembly(typeof(ProductPagedResultGraphType));

services
    .AddGraphQL(x => { x.ExposeExceptions = DebugHelper.IsDebug; })
    .AddGraphTypes(ServiceLifetime.Scoped) // Assembly.GetCallingAssembly() is implicit
    .AddGraphTypes(productGraphAssembly,ServiceLifetime.Scoped) // Add this
    .AddUserContextBuilder(httpContext => httpContext.User)
    .AddDataLoader();

您也许可以分别注册IGraphType类型:

var assembly = Assembly.GetAssembly(typeof(ProductPagedResultGraphType));

foreach (var type in assembly.GetTypes()
    .Where(x => !x.IsAbstract && typeof(IGraphType).IsAssignableFrom(x)))
{
    services.TryAdd(new ServiceDescriptor(type,type,ServiceLifetime.Scoped));
}

参考:https://github.com/graphql-dotnet/server/blob/3.4/src/Core/GraphQLBuilderExtensions.cs

本文链接:https://www.f2er.com/2906755.html

大家都在问