2016-07-14 13 views
4

私はかなりの部分を検索しましたが、ASP.NET MVCアプリケーションのようなリポジトリパターンを使用して外部REST Webサービスを使用する良い例は見つかりませんでした。オンラインで見つかったリポジトリパターンのほとんどすべての例は、SQLデータを作成しているか、ORMを使用しています。私はちょうどHttpClientを使用してデータを取得するが、リポジトリにラップされたいくつかの例を見たいと思います。HttpClient経由で外部REST Webサービスを使用しているリポジトリパターンの例?

良い例はありますか?誰かが簡単な例を書くことができますか?

答えて

6

簡単な例:

// You need interface to keep your repository usage abstracted 
// from concrete implementation as this is the whole point of 
// repository pattern. 
public interface IUserRepository 
{ 
    Task<User> GetUserAsync(int userId); 
} 

public class UserRepository : IUserRepository 
{ 
    private static string baseUrl = "https://example.com/api/" 

    public async Task<User> GetUserAsync(int userId) 
    { 
     var userString = await GetStringAsync(baseUrl + "users/" + userId); 
     // Here I use Newtonsoft.Json to deserialize JSON string to User object 
     var user = JsonConvert.DeserializeObject<User>(userString); 
     return user; 
    } 

    private static async Task<string> GetStringAsync(string url) 
    { 
     using (var httpClient = new HttpClient()) 
     { 
      return await httpClient.GetStringAsync(url); 
     } 
    } 
} 

Hereがどこにあるか/ Newtonsoft.Jsonパッケージを取得する方法について説明します。


別のオプションは、HttpClientオブジェクトを再利用し、あなたがそれで作業完了時HttpClientを配置する必要があるため、リポジトリIDisposableを作ることであろう。私の最初の例では、usingステートメントの末尾にあるHttpClientの使用の直後に発生します。

+0

ああ私は見る!また、電子メールアドレスでユーザーを取得できるようにしたい場合は、整数idとは少し異なる実装で 'public async Task GetUserAsync(文字列電子メール){}'を追加します。同じWebサービス(ユーザー、役割、製品など)から他の種類のものを取得する必要がある場合はどうしたらよいでしょうか? HttpClientを何らかのラッパークラスに抽出し、リポジトリを特定のエンティティ(UserRepository、RoleRepository、ProductRepository)にすることは理にかなっていますか? – Jiveman

+1

@Jivemanはいリポジトリ、エンティティ固有のものは完璧です。すべてのリポジトリに共通するもの、たとえばGETリクエストを実行する汎用メソッドなどがあれば、抽象的なBaseRepositoryに置くことができます。また、思考のための食糧はユニットテストリポジトリです。この場合、あなたは実際にあなたのHttpClientを簡単に模擬可能なクラスに包んで、それを依存関係としてreposに注入する必要があります。 – Andrei

+0

はい、ユニットテストは間違いなく重要です!それを言わせていただきありがとうございます。これは間違いなく、より良い方法で物事を考えるのに役立ちます。 – Jiveman

関連する問題