簡単な例:
// 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
の使用の直後に発生します。
ああ私は見る!また、電子メールアドレスでユーザーを取得できるようにしたい場合は、整数idとは少し異なる実装で 'public async Task GetUserAsync(文字列電子メール){}'を追加します。同じWebサービス(ユーザー、役割、製品など)から他の種類のものを取得する必要がある場合はどうしたらよいでしょうか? HttpClientを何らかのラッパークラスに抽出し、リポジトリを特定のエンティティ(UserRepository、RoleRepository、ProductRepository)にすることは理にかなっていますか? –
Jiveman
@Jivemanはいリポジトリ、エンティティ固有のものは完璧です。すべてのリポジトリに共通するもの、たとえばGETリクエストを実行する汎用メソッドなどがあれば、抽象的なBaseRepositoryに置くことができます。また、思考のための食糧はユニットテストリポジトリです。この場合、あなたは実際にあなたのHttpClientを簡単に模擬可能なクラスに包んで、それを依存関係としてreposに注入する必要があります。 – Andrei
はい、ユニットテストは間違いなく重要です!それを言わせていただきありがとうございます。これは間違いなく、より良い方法で物事を考えるのに役立ちます。 – Jiveman