I am trying to create layer for webservice using HttpClient in my Xamarin.Forms mobile app.
- without singlton pattern
- with singleton pattern
in first approach i am creating new http client object in each new request made by mobile applicaiton.
here is my code
  public HttpClient GetConnection()
        {
            HttpClient httpClient = new HttpClient();
            httpClient.BaseAddress = new Uri(baseAddress); 
            httpClient.Timeout = System.TimeSpan.FromMilliseconds(timeout);
            return httpClient;
        }
post request code
 public async Task<TResult> PostAsync<TRequest, TResult>(String url, TRequest requestData)
        {
            HttpClient client = GetConnection();
            String responseData = null;
            if (client != null)
            {
                String serializedObject = await Task.Run(() => JsonConvert.SerializeObject(requestData, _jsonSerializerSettings));
                var jsonContent = new StringContent(serializedObject, System.Text.Encoding.UTF8, "application/json");
                HttpResponseMessage response = await client.PostAsync(new Uri(url, UriKind.Relative), jsonContent);
                responseData = await HandleResponse(response);
                return await Task.Run(() => JsonConvert.DeserializeObject<TResult>(responseData, _jsonSerializerSettings));
            }
            else
            {
                throw new NullReferenceException("NullReferenceException @ PostAsync  httpclient is null WebRequest.cs");
            }
        }
client will use following code to execute request
new LoginService(new WebRequest()).UserLogin(userRequest);
inside class that implements IWebRequest
_webRequest.PostAsync<UserRequest,bool>(Constants.USER_LOGIN, userRequest);
in second approach i am reusing the same http client object in each new request here , my singleton class is thread safe too.
private static readonly Lazy<HttpService> lazy =
        new Lazy<HttpService>(() => new HttpService());
        public static HttpService Instance { get { return lazy.Value; } }
        private HttpClient getConnection()
        {
            client = new HttpClient();
            client.Timeout = System.TimeSpan.FromMilliseconds(timeout);
            //client.MaxResponseContentBufferSize = 500000;
            client.BaseAddress = new Uri(baseAddress);
            return client;
        }
post request code
public Task<HttpResponseMessage> sendData(String url,String jsonData)
        {
            var jsonContent = new StringContent(jsonData, System.Text.Encoding.UTF8, "application/json");
            return getConnection().PostAsync(new Uri(url, UriKind.Relative), jsonContent);
        }
client will use following code to execute
HttpService.Instance.sendData(...)
i have gone through many libraries like RestSharp over web just to explore the best and i found that most of them are creating new objects per request. so i am confused which pattern fits best.
 
     
     
     
     
    