Можно ли игнорировать свойство модели в nswag без использования [JsonIgnore]? - PullRequest
0 голосов
/ 02 октября 2019

Использование JsonIgnore невозможно в моем проекте, и [OpenApiIgnore] не работает. В swashbuckle было возможно сделать фильтр по его собственному атрибуту, но в NSwag я не нашел подобного механизма.

Пример кода:

Класс команд на шлюзе API:

[MessageNamespace("identity")]
    public class UpdateUser:ICommand
    {
        [JsonConstructor]
        public UpdateUser(string surname, string name, string middleName, string department, string position, string adAccount, string email, string userName, string password)
        {
            Surname = surname;
            Name = name;
            MiddleName = middleName;
            Department = department;
            Position = position;
            AdAccount = adAccount;
            Email = email;
            UserName = userName;
        }
        [JsonIgnore]
        public Guid Id { get; }

...

    }

Класс команд на микросервисе:

 public class UpdateUser:ICommand
    {
        [JsonConstructor]
        public UpdateUser(Guid id, string surname, string name, string middleName, string department, string position, string adAccount, string email, string userName, string password)
        {
            Id = id;
            Surname = surname;
            Name = name;
            MiddleName = middleName;
            Department = department;
            Position = position;
            AdAccount = adAccount;
            Email = email;
            UserName = userName;
        }

        public Guid Id { get; }
...

    }

Метод API на шлюзе:

[HttpPut("{id}")]
[JwtAuth(Roles.Administrator)]
public async Task<ActionResult> Put(Guid id, UpdateUser command)
{
    //Send command to RabbitMQ(serialized)
    //Id binded before sending but after construct in service ID is missing
    await SendAsync(command.Bind(c => c.Id, id));
    return Accepted();
}

Почему мне нужно удалить свойство из генерации NSwag? Потому что мне нужен Id в маршруте, но если Id также находится в теле запроса, это делает мой интерфейсный кодер агрессивным и разрушительным, а также не красивым: nswag generation

1 Ответ

1 голос
/ 02 октября 2019

Мое решение было бы использовать отдельные классы

namespace API.Models
{
  public class UpdateUser
  {
    public string Surname { get; set; }
    public string Name { get; set; }
    ...
  }
}

namespace Domain.Commands
{
  public class UpdateUser:ICommand
  {
    [JsonConstructor]
     public UpdateUser(Guid id, string surname, string name, string middleName, string department, string position, string adAccount, string email, string userName, string password)
     {
       Id = id;
       Surname = surname;
       Name = name;
       MiddleName = middleName;
       Department = department;
       Position = position;
       AdAccount = adAccount;
       Email = email;
       UserName = userName;
     }

     public Guid Id { get; }
...

  }
}

и в контроллере

namespace API.Controllers
{
  public class UserController
  {
    [HttpPut("{id}")]
    [JwtAuth(Roles.Administrator)]
    public async Task<ActionResult> Put(Guid id, API.Models.UpdateUser command)
    {
      //Send command to RabbitMQ(serialized)
      //Id binded before sending but after construct in service ID is missing
      var cmd = new Domain.Commands.UpdateUser( id, command.Surname, command.Name, ... );

      await SendAsync(cmd);
      return Accepted();
    }  
  }
}

Domain.Commands могут быть помещены в библиотеку классов и использоваться API и Microserviceа также.

...