4

Я искал вокруг совсем немного, но не нашел хороших примеров использования внешней веб-службы REST с использованием шаблона репозитория в чем-то вроде приложения ASP.NET MVC, с отсутствующей связью и значительным разделением проблем. Почти все примеры шаблонов репозитория, которые я нахожу в Интернете, записывают данные SQL или используют ORM. Я просто хотел бы увидеть некоторые примеры извлечения данных с помощью HttpClient, но они были обернуты в репозиторий.Примеры шаблона репозитория с потреблением внешнего веб-сервиса REST через HttpClient?

Любые ссылки на хорошие примеры? Или может кто-нибудь написать простой пример?

ответ

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 объект и сделать свой репозиторий IDisposable, потому что вам нужно утилизировать HttpClient, когда вы сделали с ним работать. В моем первом примере это происходит сразу после использования HttpClient в конце using.

+0

А я вижу! И если бы я захотел также получить запрос пользователя по адресу электронной почты, я бы добавил «public async Task GetUserAsync (string email) {}' с немного иной реализацией, чем с целым id. Что делать, если мне также нужно было получать другие типы материалов из одного и того же веб-сервиса (пользователя, роли, продукта и т. Д.)? Было бы целесообразно извлечь материал HttpClient в какой-либо класс-оболочку и оставить репозиторий конкретным для каждого объекта (UserRepository, RoleRepository, ProductRepository)? – Jiveman

+1

@ Jiveman да репозитории, специфичные для сущностей, имеют прекрасный смысл. Если у вас есть что-то общее для всех репозиториев, например, общий метод, который выполняет запрос GET, вы можете поместить его в абстрактный BaseRepository. Также пища для размышлений - это репозиторий для тестирования модулей. В этом случае вам действительно нужно обернуть ваш HttpClient в легкому насмешливый класс и вставить его в репозитории как зависимость. – Andrei

+0

Да, модульное тестирование, безусловно, важно! Спасибо, что упомянули об этом. Хорошо, это определенно помогает мне лучше думать о вещах. – Jiveman