Dependency injection 如何将存储库转换为类型类?
需要帮忙吗 我正在查看示例“graphql dotnet/server”,其中公开的对象只包含普通属性。但是,如果我需要解析属性并从存储库中获取数据,如何在类型类中获得respository类呢 例如: 该示例有一个显示“消息”的聊天查询Dependency injection 如何将存储库转换为类型类?,dependency-injection,graphql,graphql-dotnet,Dependency Injection,Graphql,Graphql Dotnet,需要帮忙吗 我正在查看示例“graphql dotnet/server”,其中公开的对象只包含普通属性。但是,如果我需要解析属性并从存储库中获取数据,如何在类型类中获得respository类呢 例如: 该示例有一个显示“消息”的聊天查询 公共聊天查询(IChat聊天) { 字段(“messages”,resolve:context=>chat.AllMessages.Take(100)); } 实例“chat”是此处的存储库,通过chat.AllMessages提供数据(消息) 假设一条消息
公共聊天查询(IChat聊天)
{
字段(“messages”,resolve:context=>chat.AllMessages.Take(100));
}
实例“chat”是此处的存储库,通过chat.AllMessages提供数据(消息)
假设一条消息有一个查看者列表。然后我需要从存储库中解析该列表。这是在另一个示例“graphql dotnet/examples”中完成的,其中“StarWars/Types/starwarschracter.cs”有一个好友列表,“StarWars/Types/HumanType”有一个存储库(StarWarsData)插入到构造函数中,并可用于“好友”的解析方法:
公共类HumanType:ObjectGraphType
{
公共人员类型(StarWarsData数据)
{
Name=“人类”;
字段(h=>h.Id).Description(“人类的Id”);
字段(h=>h.Name,可空:true);
场(
“朋友”,
解析:context=>data.GetFriends(context.Source)
);
字段(“appearsIn”,“他们出现在哪部电影中”);
字段(h=>h.HomePlanet,可空:true)。描述(“人类的家园星球”);
接口();
}
}
但是,在服务器示例中执行相同的操作是行不通的
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;
}
}
public类MessageType:ObjectGraphType
{
公共消息类型(IChat聊天)
{
字段(o=>o.Content);
字段(o=>o.SentAt);
字段(o=>o.From,false,typeof(MessageFromType)).Resolve(ResolveFrom);
场(
“观众”,
解析:context=>chat.GetViewers(context.Source)
);
}
来自ResolveFrom的私有消息(ResolveFieldContext上下文)
{
var message=context.Source;
返回消息。来自;
}
}
当我将聊天库添加到MessageType中的构造函数时,它失败了
我显然在这里遗漏了一些东西;为什么依赖注入不将聊天实例注入到“graphql dotnet/server”项目中的MessageType类中?
但它在“graphql dotnet/examples”项目中起作用。
最好的,
Magnus要使用DI,需要在模式类的构造函数中传递依赖项解析器。默认解析器使用的是
Activator.CreateInstance
,因此您必须向它介绍您正在使用的容器
services.AddSingleton<IDependencyResolver>(
s => new FuncDependencyResolver(s.GetRequiredService));
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;
}
}
services.AddSingleton<IDependencyResolver>(
s => new FuncDependencyResolver(s.GetRequiredService));
public class StarWarsSchema : Schema
{
public StarWarsSchema(IDependencyResolver resolver)
: base(resolver)
{
Query = resolver.Resolve<StarWarsQuery>();
Mutation = resolver.Resolve<StarWarsMutation>();
}
}