我可以对多个GraphQL模式使用依赖注入吗?

时间:2019-10-09 15:31:57

标签: c# dependency-injection graphql azure-functions

我目前有两个可用的模式,可以解决完全不同的查询。这时,azure函数启动文件在进行依赖项注入过程时,只会采用最新添加的架构。因此,查询仅解析为最新添加的架构。我相信这与所使用的接口存在命名冲突,但是我实际上并不知道如何解决它。

我尝试将服务添加为临时服务和范围服务。

builder.Services.AddTransient<ISchema>(_ => new SchemaOne(new FuncDependencyResolver(type => (IGraphType)_.GetRequiredService(type))));
builder.Services.AddTransient<ISchema>(_ => new SchemaTwo(new FuncDependencyResolver(type => (IGraphType)_.GetRequiredService(type))));

builder.Services.AddScoped<ISchema>(_ => new SchemaOne(new FuncDependencyResolver(type => (IGraphType)_.GetRequiredService(type))));
builder.Services.AddScoped<ISchema>(_ => new SchemaTwo(new FuncDependencyResolver(type => (IGraphType)_.GetRequiredService(type))));

目标是能够使两个查询都解析为其各自的模式。此时{ queryOne { name } }返回错误"message": "Cannot query field \"queryOne\" on type \"QueryTwoType\".",

1 个答案:

答案 0 :(得分:0)

查看@ user1672994提供的link之后,我选择创建自己的界面,然后将其注入到Azure函数中。之所以选择执行此操作,是因为我想为azure函数提供选择所使用模式的机会。我在提供的链接中找不到该用例的解决方案。

Azure函数依赖注入代码

builder.Services.AddTransient<ISchemaMapper>(_ => new SchemaMapper(new Dictionary<string,ISchema> {
{"SchemaOne", new SchemaOne(new FuncDependencyResolver(type => (IGraphType)_.GetRequiredService(type))) },
{"SchemaTwo", new SchemaTwo(new FuncDependencyResolver(type => (IGraphType)_.GetRequiredService(type))) } }));

使用的接口

public interface ISchemaMapper
{
  ISchema GetSchema(string schema);
}

界面的实现

public class SchemaMapper : ISchemaMapper
{
   public Dictionary<string, ISchema> mappedSchema;
   public SchemaMapper(Dictionary<string, ISchema> mappedSchemas)
   {
      this.mappedSchema = mappedSchemas;
   }

   public ISchema GetSchema(string schema)
   {
      return mappedSchema[schema];
   }
}

目前,这是解决相互冲突的依赖项注入的一种卑鄙的方法,但是如果我找到一个更好的方法或者它在未来发展壮大,我将进行更新。