通过HttpClient使用外部REST Web服务的存储库模式示例?

时间:2016-07-14 16:21:05

标签: c# asp.net-mvc web-services httpclient repository-pattern

我已经搜索了很多,但是没有找到任何使用存储库模式在ASP.NET MVC应用程序中使用外部REST Web服务的好例子,它们具有松散耦合和有意义的关注点分离。我在网上找到的几乎所有存储库模式的例子都是编写SQL数据或使用ORM。我只想看一些使用HttpClient检索数据但包装在存储库中的例子。

是否有任何好的例子?或者有人可以写一个简单的例子吗?

1 个答案:

答案 0 :(得分:8)

一个简单的例子:

// 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 userJson = await GetStringAsync(baseUrl + "users/" + userId);
        // Here I use Newtonsoft.Json to deserialize JSON string to User object
        var user = JsonConvert.DeserializeObject<User>(userJson);
        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使用之后。