Нужна помощь, пожалуйста ...
Я смотрю на пример «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".
Лучший, Магнус


Чтобы использовать 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>();
}
}