Какой правильный маршрут с OData v4? - PullRequest
1 голос
/ 25 марта 2019

Я создаю службу OData v4, и мне нужна помощь в моей модели, и что можно сделать, а что нельзя сделать с OData.Я также использую .NET Core 2.2, Entity Framework Core и ASP.NET Core.Это мое первое приложение с .NET Core.

У меня на данный момент есть этот POST-запрос

[HttpPost]
[ODataRoute("Events({eventKey})/Bookings")]
public async Task<IActionResult> PostBooking([FromODataUri] Guid eventKey, [FromBody] Booking booking)
{
    // ...
}

И мой POCO (EF-сущность)

public class Booking
{
    [Key]
    public Guid Id { get; set; }

    [Required]
    public Event Event { get; set; }

    [Required]
    public User Student { get; set; }

    [Required]
    public int Position { get; set; } // Position in the registration queue

    [Required]
    public DateTime ReservationTime { get; set; }

    public DateTime? CancelTime { get; set; } // null by default
}

В этом POCO бронирование только CancelTime не требуется.Во время PostBooking () система настроит все необходимые свойства:

POST https://www.example.com/odata/Events(84a5c788-4f57-4983-b074-4a03a401484a)/Bookings
BODY
{
    // In fact my body is empty because Position and ReservationTime I given by system. (now)
    // Id is simply a new guid
    // Event is in my oData link (84a5c788-4f57-4983-b074-4a03a401484a). I need to check it can be found
    // Position is the number of booking register for this event + 1.
    // UserId will be in my header (in a session token I will implement later with all security)
}

Я вижу 3 решения

1) Использование OData Action?2) Мне не нужно бронировать объект из тела в JSON.Можно ли написать метод POST следующим образом:

[HttpPost]
[ODataRoute("Events({eventKey})/Bookings")]
public async Task<IActionResult> PostBooking([FromODataUri] Guid eventKey)
{
    // ...
}

3) Или вот так

[HttpPost]
[ODataRoute("Events({eventKey})/Bookings")]
public async Task<IActionResult> PostBooking([FromODataUri] Guid eventKey, [FromBody] BookingPostActionDto booking)
{
    // ...
}

где

public class BookingPostActionDto() // Is a data tranfert object that I use only for API, not save in database
{
    [Required]
    public Guid RegistrationUserId { get; set; }
}

В соответствии со стандартом ODataрабочие решения здесь?Я спрашиваю не о лучшем, а о действительном в соответствии со стандартом.Например, я даже не знаю, позволяет ли OData мне работать с системой Dto, как в моем решении 3. Мое решение 2 работает, если я никогда не проверяю свое состояние модели, поскольку я проверяю свое состояние модели, оно пропустит все необходимые данные.Могу ли я создать действие, как в моем решении 1, когда я могу сделать POST, и POST кажется более подходящим?

1 Ответ

0 голосов
/ 25 марта 2019

Я получил хороший опыт, взяв рекомендуемый способ . Если вы хотите работать с DTO в целом, может помочь вам .

Относительно вашего вопроса я бы взял стандартный ODataAction:

[HttpPost]
[ODataRoute("Events({eventKey})/Bookings")]
public async Task<IActionResult> PostBooking([FromODataUri] Guid eventKey, [FromBody] Booking booking)
{
    // ...
}

Неважно, как выглядит ваша JSON-нагрузка. Если вам нужно только отправить RegistrationUserId, вы можете это сделать:

{
    "Student":{
        "Id:"1"
    }
} 

Или где бы вы ни хранили UserId ...

Вы также можете выбрать 2-й путь, если вам не нужны дополнительные данные от клиента.

Если нет причин (например, проблем с производительностью или скрытой конфиденциальной информации), использовать DTO я не буду. Весь API будет оставаться простым, пока не потребуется дополнительная сложность.

...