4

나는 꽤 많이 조사했지만, ASP.NET MVC 응용 프로그램과 같이 저장소 패턴을 사용하여 외부 REST 웹 서비스를 사용하는 좋은 예를 발견하지 못했습니다. 느슨한 결합과 의미있는 분리가 있습니다. 온라인으로 찾은 저장소 패턴의 거의 모든 예는 SQL 데이터를 쓰거나 ORM을 사용하고 있습니다. HttpClient를 사용하여 데이터를 가져 오는 몇 가지 예를보고 싶지만 저장소에 래핑되었습니다.HttpClient를 통해 외부 REST 웹 서비스를 사용하는 저장소 패턴의 예는 무엇입니까?

좋은 예에 대한 언급이 있습니까? 아니면 간단한 예를 쓸 수 있습니까?

답변

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을하는 것입니다. 첫 번째 예제에서는 문장의 끝에 HttpClient 사용 바로 직후에 발생합니다.

+0

아하이 봐요! 그리고 전자 메일 주소로 사용자를 검색 할 수있게하려면 정수 ID와 약간 다른 구현을 사용하여'public async Task GetUserAsync (문자열 전자 메일) {}'을 추가합니다. 같은 웹 서비스 (사용자, 역할, 제품 등)에서 다른 유형의 물건을 얻을 수 있어야 할 필요가 있다면 어떻게해야합니까? 어떤 종류의 래퍼 클래스에 HttpClient 항목을 추출하고 엔터티 (UserRepository, RoleRepository, ProductRepository)별로 저장소를 남겨 두는 것이 합리적일까요? – Jiveman

+1

@ 지브먼 예 저장소, 엔티티에 특정한 것은 완벽한 의미입니다. 예를 들어 GET 요청을 수행하는 일반적인 방법과 같이 모든 리포지토리에 공통적 인 것이 있다면 추상 BaseRepository에 넣을 수 있습니다. 또한 생각을위한 음식은 단위 테스트 저장소입니다. 이 경우 실제로 HockpClient를 쉽게 mockable 클래스로 랩핑하고 repos에 의존성으로 주입해야합니다. – Andrei

+0

예, 단위 테스트가 반드시 중요합니다! 언급 해 주셔서 감사합니다. 좋습니다, 이것은 확실히 더 나은 방법으로 사물을 생각하는 데 도움이됩니다. – Jiveman