1

特定のリソースにハイパーメディアを実装する方法についていくつかの調査を行っていますが、実際の実装例を見つけることができず、抽象化だけです...

ご存知のように、さまざまな記事で、男は次のようなメソッドを作成しています。

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;
    }

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; }
}

そのための適切な方法はありますか?つまり、リンクをハードコーディングせずに?特定のタイプ、つまり Appointment クラスに対してそれらを動的に作成する方法は?

C# MVC ではなく、C# Webapi を使用しています。

4

2 に答える 2

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. すべてのクラスの HyperMedia プロパティを宣言せずに、リンクを結果オブジェクトに動的に追加することもできます。

    • リンクなしでクラスを定義します。

      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" 
          }));
      }
      
于 2016-11-16T09:37:40.217 に答える
1

を確実に に抽出できますRel( Enum2 実際には、標準のもの -DeleteなどPut- とカスタムのもの - 後者には のようなカスタムの関係を含めることができますcustomer-by-id)。

パラメータを動的に構築することもできHrefます(オブジェクトのプロパティからパラメータを取得します)が、リソース自体に関しては...おそらくそれをハードコーディングすることにこだわっています(リフレクションを調べることもできます)。

于 2016-11-16T08:14:32.687 に答える