我目前有两个可用的模式,可以解决完全不同的查询。这时,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\".",
答案 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];
}
}
目前,这是解决相互冲突的依赖项注入的一种卑鄙的方法,但是如果我找到一个更好的方法或者它在未来发展壮大,我将进行更新。