Я использую Горячий шоколад в качестве GraphQL сервера из моего ASP.NET Core Api. Параметры запроса должны иметь необязательный параметр, Guid, однако, если Guid имеет значение null, модель должна сгенерировать случайный Guid.
public class MutationType : ObjectType<Mutation> {
protected override void Configure(IObjectTypeDescriptor<Mutation> desc)
{
desc
.Field((f) => f.CreateAction(default))
.Name("createAction");
}
}
Класс Mutation имеет следующий метод.
public ActionCommand CreateAction(ActionCommand command) {
...
return command;
}
Класс ActionCommand выглядит так:
public class ActionCommand {
public Guid Id { get; set; }
public string Name { get; set; }
public ActionCommand(string name, Guid id = null) {
Name = name;
Id = id ?? Guid.NewGuid()
}
}
Эта команда является рассматриваемой проблемой. Я хочу иметь возможность использовать эту логику для свойства Id в GraphQL, документация не ясна (на мой взгляд), может ли кто-нибудь пролить свет на это?
Спасибо!
Снова привет, Майкл, я нашел решение этого вопроса, я опубликую его как ответ, спасибо! Другой вопрос, однако, я пытаюсь использовать «URLType» для ввода, но он говорит, что «www.google.com» не соответствует типу, что-то я делаю неправильно?





Решением этой проблемы было создание абстрактного базового типа CommandType следующим образом:
public abstract class CommandType<TCommand> : InputObjectType<TCommand>
where TCommand : Command {
protected override void Configure(IInputObjectTypeDescriptor<TCommand> desc) {
desc.Field(f => f.CausationId).Ignore();
desc.Field(f => f.CorrelationId).Ignore();
}
}
Затем пользовательские типы ввода наследуют этот класс следующим образом:
public class SpecificCommandType : CommandType<SpecificCommand> {
protected override void Configure(IInputObjectTypeDescriptor<SpecificCommand> desc) {
base.Configure(desc);
desc.Field(t => t.Website).Type<NonNullType<UrlType>>();
}
}
Или короткая рука, если дальнейшая настройка не требуется.
public class SpecificCommandType : CommandType<SpecificCommand> { }
Сами команды являются производными от класса Command, который генерирует Guid для необходимых значений.
public abstract class Command {
protected Command(Guid? correlationId = null, Guid? causationId = null) {
this.CausationId = this.CorrelationId = Guid.NewGuid();
}
public Guid CausationId { get; set; }
public Guid CorrelationId { get; set; }
}
В этом случае ваша команда является входным объектом и выходным объектом, и вы хотите создать новый Guid всякий раз, когда объект не был предоставлен?