В GraphQL HotChocolate вы можете иметь дополнительные параметры или использовать конструктор? - PullRequest
0 голосов
/ 11 июля 2019

Я использую HotChocolate в качестве GraphQL сервера из моего ASP.NET Core Api. Параметры запроса должны иметь необязательный параметр, Guid, однако, если Guid равен нулю, то модель должна генерировать случайный 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, документация не ясна (на мой взгляд), кто-нибудь может пролить свет на это?

Спасибо!

1 Ответ

0 голосов
/ 18 июля 2019

Решением этой проблемы было создание абстрактного базового 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>>();
   }
}

Или короткийhand, если дальнейшая настройка не требуется.

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; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...