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

Jiv*_*man 9 c# asp.net-mvc web-services httpclient repository-pattern

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

有没有提到好的例子?或者有人可以写一个简单的例子吗?

And*_*rei 9

一个简单的例子:

// 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

是在哪里/如何获得Newtonsoft.Json包.


另一种选择是重用HttpClient对象并创建存储库,IDisposable因为HttpClient在使用它时需要进行处置.在我的第一个例子中,它恰好HttpClientusing语句结束后使用.

  • 正如Andrei和@Jiveman所提到的:不要创建新的HttpClient,并在每次需要时使用stmt进行处理.HttpClient旨在重用于APPLICATION的范围.因此,您应该使用具有单例范围的IoC容器,或者创建一个静态HttpClient实例,并将其注入到您的存储库中.否则你的应用程序将开始离开开放的TCP套接字,服务器/机器性能将开始下降. (5认同)
  • 每次进行 API 调用时都创建 httpclient 对象是一个坏主意。因为即使你使用 using 语句,套接字也可能不会被释放,最终你会得到套接字耗尽异常。而是使用 IHttpClientFactory 来创建 httpclient。 (3认同)