Как DI репозиторий в Type-класс? - PullRequest
0 голосов
/ 01 июня 2018

Здесь нужна помощь, пожалуйста ...

Я смотрю на пример " graphql-dotnet / server ", где открытые объекты содержат только простые свойства.Но что, если мне нужно разрешить свойство и получить данные из репозитория, как я могу получить класс репозитория в классе Type?

Пример: в примере есть ChatQuery, отображающий «сообщения».

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), вставленный в конструктор, и его можно использовать в методе разрешения для" друзей ":

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, он не работает.

Я, очевидно, что-то здесь упускаю;почему Dependency Injection не внедряет экземпляр чата в класс MessageType в проекте "graphql-dotnet / server"?Но это работает в проекте "graphql-dotnet / examples".

Best, Magnus

1 Ответ

0 голосов
/ 03 июня 2018

Чтобы использовать DI, вам нужно передать решатель зависимостей в конструкторе вашего класса Schema.В качестве распознавателя по умолчанию используется 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>();
    }
}

https://github.com/graphql-dotnet/examples/blob/bcf46c5c502f8ce75022c50b9b23792e5146f6d2/src/AspNetCore/Example/Startup.cs#L20

https://github.com/graphql-dotnet/examples/blob/bcf46c5c502f8ce75022c50b9b23792e5146f6d2/src/StarWars/StarWarsSchema.cs#L6-L14

...