GraphQL + Autofac
GraphQL + Autofac
我目前正在探索 GraphQL。在我的 ObjectGraphTypes
之一中,我想注入一个服务实现,它向 EF 查询一些附加数据。
public class RoomType : ObjectGraphType<Room>
{
public RoomType(IUserRepository userRepository)
{
Field(x => x.Id).Description("Identifier for a room");
Field(x => x.Name).Description("Name of the room");
Field<ListGraphType<UserType>, IEnumerable<User>>().Name("Users").Resolve(ctx =>
{
var roomId = ctx.Source.Id;
return userRepository.GetUsersInRoom(roomId);
});
}
}
RoomType 和 IUserRepository 都已在 Autofac 容器中注册。但是,在执行过程中 RoomType 无法解析,因为它缺少无参数构造函数,这让我认为它是通过反射而不是通过容器构造的。关于如何进行的任何建议?
谢谢!
问题出在架构中。你必须有一个在容器中注册的 ISchema 的实现。您还需要注册 IDependencyResolver
的实现,它是 GraphQl 库 (GraphQL.IDependencyResolver
) 中的一个接口,如下所示:
builder.Register<IDependencyResolver>(c =>
{
var context = c.Resolve<IComponentContext>();
return new FuncDependencyResolver(type => context.Resolve(type));
});
最后,确保您的所有 schemas
、queries
和 types
都已在 autofac 中注册。
我目前正在探索 GraphQL。在我的 ObjectGraphTypes
之一中,我想注入一个服务实现,它向 EF 查询一些附加数据。
public class RoomType : ObjectGraphType<Room>
{
public RoomType(IUserRepository userRepository)
{
Field(x => x.Id).Description("Identifier for a room");
Field(x => x.Name).Description("Name of the room");
Field<ListGraphType<UserType>, IEnumerable<User>>().Name("Users").Resolve(ctx =>
{
var roomId = ctx.Source.Id;
return userRepository.GetUsersInRoom(roomId);
});
}
}
RoomType 和 IUserRepository 都已在 Autofac 容器中注册。但是,在执行过程中 RoomType 无法解析,因为它缺少无参数构造函数,这让我认为它是通过反射而不是通过容器构造的。关于如何进行的任何建议?
谢谢!
问题出在架构中。你必须有一个在容器中注册的 ISchema 的实现。您还需要注册 IDependencyResolver
的实现,它是 GraphQl 库 (GraphQL.IDependencyResolver
) 中的一个接口,如下所示:
builder.Register<IDependencyResolver>(c =>
{
var context = c.Resolve<IComponentContext>();
return new FuncDependencyResolver(type => context.Resolve(type));
});
最后,确保您的所有 schemas
、queries
和 types
都已在 autofac 中注册。