如何将存储库 DI 到 Type-class?
How to DI repository into Type-class?
这里需要一些帮助...
我正在查看示例“graphql-dotnet/server”,其中公开的对象仅包含普通属性。但是,如果我需要解析 属性 并从存储库获取数据,我如何才能在 Type-class?
中获取存储库 class
示例:
该样本有一个 ChatQuery 公开 "messages".
public ChatQuery(IChat chat)
{
Field<ListGraphType<MessageType>>("messages", resolve: context => chat.AllMessages.Take(100));
}
实例“chat”是此处的存储库,并通过 chat.AllMessages 提供数据(消息)。
假设一条消息有一个查看者列表。然后我需要从存储库中解析该列表。这是在另一个例子“graphql-dotnet/examples”中完成的,其中“StarWars/Types/StarWarsCharacter.cs”有一个朋友列表并且“StarWars/Types/HumanType”在构造函数中插入了存储库 (StarWarsData),可以在 "friends":
的解析方法中使用
public class HumanType : ObjectGraphType<Human>
{
public HumanType(StarWarsData data)
{
Name = "Human";
Field(h => h.Id).Description("The id of the human.");
Field(h => h.Name, nullable: true).Description("The name of the human.");
Field<ListGraphType<CharacterInterface>>(
"friends",
resolve: context => data.GetFriends(context.Source)
);
Field<ListGraphType<EpisodeEnum>>("appearsIn", "Which movie they appear in.");
Field(h => h.HomePlanet, nullable: true).Description("The home planet of the human.");
Interface<CharacterInterface>();
}
}
但是,在服务器示例中做同样的事情是行不通的。
public class MessageType : ObjectGraphType<Message>
{
public MessageType(IChat chat)
{
Field(o => o.Content);
Field(o => o.SentAt);
Field(o => o.From, false, typeof(MessageFromType)).Resolve(ResolveFrom);
Field<ListGraphType<Viewer>>(
"viewers",
resolve: context => chat.GetViewers(context.Source)
);
}
private MessageFrom ResolveFrom(ResolveFieldContext<Message> context)
{
var message = context.Source;
return message.From;
}
}
当我将聊天存储库添加到 MessageType 中的构造函数时,它失败了。
我显然在这里遗漏了一些东西;为什么依赖注入不将聊天实例注入 "graphql-dotnet/server" 项目中的 MessageType class?
但它在 "graphql-dotnet/examples" 项目中有效。
最好的,
马格努斯
要使用 DI,您需要在架构的构造函数中传递依赖项解析器 class。默认解析器使用 Activator.CreateInstance
,所以你必须告诉它你正在使用的容器。
services.AddSingleton<IDependencyResolver>(
s => new FuncDependencyResolver(s.GetRequiredService));
IDependecyResolver
是graphql-dotnet项目中的一个接口。
public class StarWarsSchema : Schema
{
public StarWarsSchema(IDependencyResolver resolver)
: base(resolver)
{
Query = resolver.Resolve<StarWarsQuery>();
Mutation = resolver.Resolve<StarWarsMutation>();
}
}
这里需要一些帮助...
我正在查看示例“graphql-dotnet/server”,其中公开的对象仅包含普通属性。但是,如果我需要解析 属性 并从存储库获取数据,我如何才能在 Type-class?
中获取存储库 class示例: 该样本有一个 ChatQuery 公开 "messages".
public ChatQuery(IChat chat)
{
Field<ListGraphType<MessageType>>("messages", resolve: context => chat.AllMessages.Take(100));
}
实例“chat”是此处的存储库,并通过 chat.AllMessages 提供数据(消息)。
假设一条消息有一个查看者列表。然后我需要从存储库中解析该列表。这是在另一个例子“graphql-dotnet/examples”中完成的,其中“StarWars/Types/StarWarsCharacter.cs”有一个朋友列表并且“StarWars/Types/HumanType”在构造函数中插入了存储库 (StarWarsData),可以在 "friends":
的解析方法中使用public class HumanType : ObjectGraphType<Human>
{
public HumanType(StarWarsData data)
{
Name = "Human";
Field(h => h.Id).Description("The id of the human.");
Field(h => h.Name, nullable: true).Description("The name of the human.");
Field<ListGraphType<CharacterInterface>>(
"friends",
resolve: context => data.GetFriends(context.Source)
);
Field<ListGraphType<EpisodeEnum>>("appearsIn", "Which movie they appear in.");
Field(h => h.HomePlanet, nullable: true).Description("The home planet of the human.");
Interface<CharacterInterface>();
}
}
但是,在服务器示例中做同样的事情是行不通的。
public class MessageType : ObjectGraphType<Message>
{
public MessageType(IChat chat)
{
Field(o => o.Content);
Field(o => o.SentAt);
Field(o => o.From, false, typeof(MessageFromType)).Resolve(ResolveFrom);
Field<ListGraphType<Viewer>>(
"viewers",
resolve: context => chat.GetViewers(context.Source)
);
}
private MessageFrom ResolveFrom(ResolveFieldContext<Message> context)
{
var message = context.Source;
return message.From;
}
}
当我将聊天存储库添加到 MessageType 中的构造函数时,它失败了。
我显然在这里遗漏了一些东西;为什么依赖注入不将聊天实例注入 "graphql-dotnet/server" 项目中的 MessageType class? 但它在 "graphql-dotnet/examples" 项目中有效。
最好的, 马格努斯
要使用 DI,您需要在架构的构造函数中传递依赖项解析器 class。默认解析器使用 Activator.CreateInstance
,所以你必须告诉它你正在使用的容器。
services.AddSingleton<IDependencyResolver>(
s => new FuncDependencyResolver(s.GetRequiredService));
IDependecyResolver
是graphql-dotnet项目中的一个接口。
public class StarWarsSchema : Schema
{
public StarWarsSchema(IDependencyResolver resolver)
: base(resolver)
{
Query = resolver.Resolve<StarWarsQuery>();
Mutation = resolver.Resolve<StarWarsMutation>();
}
}