Dependency injection 如何将存储库转换为类型类?

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提供数据(消息) 假设一条消息

需要帮忙吗

我正在查看示例“graphql dotnet/server”,其中公开的对象只包含普通属性。但是,如果我需要解析属性并从存储库中获取数据,如何在类型类中获得respository类呢

例如: 该示例有一个显示“消息”的聊天查询

公共聊天查询(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>();
    }
}