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