간단한 예 :
// 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
을하는 것입니다. 첫 번째 예제에서는 문장의 끝에 HttpClient
사용 바로 직후에 발생합니다.
아하이 봐요! 그리고 전자 메일 주소로 사용자를 검색 할 수있게하려면 정수 ID와 약간 다른 구현을 사용하여'public async Task GetUserAsync (문자열 전자 메일) {}'을 추가합니다. 같은 웹 서비스 (사용자, 역할, 제품 등)에서 다른 유형의 물건을 얻을 수 있어야 할 필요가 있다면 어떻게해야합니까? 어떤 종류의 래퍼 클래스에 HttpClient 항목을 추출하고 엔터티 (UserRepository, RoleRepository, ProductRepository)별로 저장소를 남겨 두는 것이 합리적일까요? –
Jiveman
@ 지브먼 예 저장소, 엔티티에 특정한 것은 완벽한 의미입니다. 예를 들어 GET 요청을 수행하는 일반적인 방법과 같이 모든 리포지토리에 공통적 인 것이 있다면 추상 BaseRepository에 넣을 수 있습니다. 또한 생각을위한 음식은 단위 테스트 저장소입니다. 이 경우 실제로 HockpClient를 쉽게 mockable 클래스로 랩핑하고 repos에 의존성으로 주입해야합니다. – Andrei
예, 단위 테스트가 반드시 중요합니다! 언급 해 주셔서 감사합니다. 좋습니다, 이것은 확실히 더 나은 방법으로 사물을 생각하는 데 도움이됩니다. – Jiveman