3

C# インターフェイスを作成し、Contract.dll にコンパイルしました。Contract.dll は、ASP.NET MVC Web サイト (このシナリオではクライアント) および ASP.NET Web API サービスによって参照されます。

Web サイトで Refit を使用してサービスを呼び出します。Refit の Get 属性と Web API の HttpGet 属性で Contract.dll の定数を使用して、サービス メソッドの URL を示してみました。これにより、URL を 1 か所で指定して、クライアントとサービスから参照できるようになります。

クライアント

public static class WidgetServiceUrls
{
    public const string ListByName = "/widget/list/{Name}";
}



public interface IWidgetService
{
    // Refit requires a string literal URL, not a constant.  Ensure the implementing service uses the same URL.
    [Get(WidgetServiceUrls.ListByName)]
    Task<List<Widget>> List(string Name);
}

サービス

// TODO: Determine how to eliminate duplicate URL string in service controller action and interface method.
[HttpGet(WidgetServiceUrls.ListByName)]
public async Task<List<Widget>> List(string Name)

RestService.For(httpClient) を呼び出すと、Refit は例外をスローします。

IWidgetService は Refit インターフェイスのようには見えません。Refit HTTP メソッド属性を持つ少なくとも 1 つのメソッドがあり、Refit がプロジェクトにインストールされていることを確認してください。

どうやら、Refit は Get 属性の定数を理解していないようです。両方の場所で文字列リテラルを使用すると、コードは正しく実行されます。ただし、URL を 2 か所で繰り返すことにより、 DRYの原則に違反しています。

Refit クライアントと Web API サービス メソッドが同じ URL を使用するように、Contract.dll のインターフェイスに注釈を付けるにはどうすればよいですか?

4

1 に答える 1