Как сделать DI-репозиторий в Type-класс?

Нужна помощь, пожалуйста ...

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

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

public ChatQuery(IChat chat)
    {
        Field<ListGraphType<MessageType>>("messages", resolve: context => chat.AllMessages.Take(100));
    }

Экземпляр «чат» является здесь хранилищем и обслуживает данные (сообщения) через chat.AllMessages.

Допустим, у сообщения есть список зрителей. Затем мне нужно разрешить этот список из репозитория. Это сделано в другом примере «graphql-dotnet / примеры», где «StarWars / Типы / StarWarsCharacter.cs» содержит список друзей, а «Звездные войны / Типы / 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, он терпит неудачу.

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

Лучший, Магнус

Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Лучшие практики использования Guice в ваших Java-проектах
Лучшие практики использования Guice в ваших Java-проектах
Guice от Google - это популярная система инъекции зависимостей для Java-приложений. Он помогает разработчикам создавать более ремонтопригодный,...
1
0
504
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы использовать DI, вам необходимо передать преобразователь зависимостей в конструктор вашего класса схемы. Решатель по умолчанию использует 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

Другие вопросы по теме