2016-11-14 7 views
1

я делаю некоторые исследования о том, как реализовать гипермедиа для конкретного ресурса, но не может найти реальный пример реализации, только абстракций ...Правильный подход к созданию гипермедиа в C# WebAPI

Вы знаете, в различные статьи, парень создать метод, как:

public List<Link> CreateLinks(int id) 
{ 
    ...//Here the guy put these three dots, whyyyyyyyyyy? 
} 

То, что я до сих пор:

public Appointment Post(Appointment appointment) 
    { 
     //for sake of simplicity, just returning same appointment 
     appointment = new Appointment{ 
      Date = DateTime.Now, 
      Doctor = "Dr. Who", 
      Slot = 1234, 
      HyperMedia = new List<HyperMedia> 
      { 
       new HyperMedia{ Href = "/slot/1234", Rel = "delete" }, 
       new HyperMedia{ Href = "/slot/1234", Rel = "put" }, 
      } 
     }; 

     return appointment; 
    } 

и класс Назначение:

public class Appointment 
{ 
    [JsonProperty("doctor")] 
    public string Doctor { get; set; } 

    [JsonProperty("slot")] 
    public int Slot { get; set; } 
    [JsonProperty("date")] 
    public DateTime Date { get; set; } 

    [JsonProperty("links")] 
    public List<HyperMedia> HyperMedia { get; set; } 
} 

public class HyperMedia 
{ 
    [JsonProperty("rel")] 
    public string Rel { get; set; } 

    [JsonProperty("href")] 
    public string Href { get; set; } 
} 

Есть ли подходящий способ? Я имею в виду, без жесткого кодирования ссылок? Как создать их динамически для заданного типа, т. Е. Класса назначения?

Я использую C# Webapi, а не C# MVC.

ответ

2
  1. Для добавления маршрутов динамически коллекции HyperMedia вы можете использовать маршрут именования:

    • Определить маршрут с определенным именем (например, для удаления):

      [Route("{id:int}", Name = "AppointmentDeletion")] 
      public IHttpActionResult Delete(int slot) 
      { 
          //your code 
      } 
      
    • Использовать его UrlHelper.Link метод:

      public Appointment Post(Appointment appointment) 
      { 
          appointment = new Appointment 
          { 
           HyperMedia = new List<HyperMedia> 
           { 
            new HyperMedia 
            { 
             Href = Url.Link("AppointmentDeletion", new { slot = 1234 }), 
             Rel = "delete" 
            } 
           } 
      
          return appointment; 
      }; 
      
  2. Также можно добавить ссылки динамически объекта результата без объявления свойства гипермедиа для каждого класса:

    • Определить класс без ссылок:

      public class Appointment 
      { 
          [JsonProperty("doctor")] 
          public string Doctor { get; set; } 
      
          [JsonProperty("slot")] 
          public int Slot { get; set; } 
      
          [JsonProperty("date")] 
          public DateTime Date { get; set; } 
      } 
      
    • Определение способ расширения:

      public static class LinkExtensions 
      { 
          public static dynamic AddLinks<T>(this T content, params object[] links) 
          { 
           IDictionary<string, object> result = new ExpandoObject(); 
      
           typeof (T) 
            .GetProperties(BindingFlags.Public | BindingFlags.Instance) 
            .ToList() 
            .ForEach(_ => result[_.Name.ToLower()] = _.GetValue(content)); 
      
           result["links"] = links; 
      
           return result; 
          } 
      } 
      
    • Использование:

      public IHttpActionResult Post(Appointment appointment) 
      { 
          return Ok(appointment.AddLinks(new HyperMedia 
          { 
           Href = Url.Link("AppointmentDeletion", new { slot = 1234 }), 
           Rel = "delete" 
          })); 
      } 
      
+0

Спасибо. Так что моя модель не так далека ... Ответ принят. –

1

Вы можете определенно извлечь Rel в Enum (2 в самом деле, стандарт один - Delete, Put и т.д. - и обычай один - последний может содержать собственные отношения как customer-by-id).

Вы также можете динамически создать параметры Href (вытащить параметры из свойств объекта), но что касается самого ресурса ... вы, вероятно, застряли в жестком кодировании (вы также можете посмотреть в отражение).

+0

Спасибо, плюс 1 за помощь. Я подумаю об этом. –

Смежные вопросы