I've a web service class to handle all requests to the external service.
All the methods are very similar, so I want to refactor this into DRY code.
This is an app in Xamarin.Forms. I'm making the external api so if anything should be changed there I can.
class WebService : IWebService
{
public WebService(IRestClient restClient, IConnectivity connectivity)
{
RestClient = restClient;
Connectivity = connectivity;
}
IRestClient RestClient { get; }
IConnectivity Connectivity { get; }
string SessionId { get; set; }
public bool HasSession => !string.IsNullOrEmpty(SessionId);
public ServiceResponse Login(string username, string password)
{
if (!Connectivity.IsConnected)
{
return new ServiceResponse
{
ErrorMessage = "No internet connection.",
Success = false
};
}
var request = new RestRequest("security/login", Method.POST);
request.AddParameter("Username", username);
request.AddParameter("Password", password);
var response = RestClient.Execute<LoginResponse>(request);
if (response.IsSuccessful)
{
SessionId = response.Data.SessionId;
return new ServiceResponse
{
Success = true
};
}
else
{
var responseMessage = JsonUtils.DeserializeAnonymousType(response.Content, new { Message = "" });
if (!string.IsNullOrEmpty(responseMessage.Message))
return new ServiceResponse
{
ErrorMessage = responseMessage.Message,
Success = false
};
else
return new ServiceResponse
{
ErrorMessage = response.ErrorMessage,
Success = false
};
}
}
public ServiceResponse<IEnumerable<Scanner>> GetScanners()
{
if (!Connectivity.IsConnected)
{
return new ServiceResponse<IEnumerable<Scanner>>
{
ErrorMessage = "No internet connection.",
Success = false
};
}
var request = new RestRequest("scan/getscanners", Method.GET);
request.AddHeader("SessionId", SessionId);
var response = RestClient.Execute<GetScannersResponse>(request);
if (response.IsSuccessful)
{
return new ServiceResponse<IEnumerable<Scanner>>
{
Data = response.Data.Scanners,
Success = true
};
}
else
{
var responseMessage = JsonUtils.DeserializeAnonymousType(response.Content, new { Message = "" });
if (!string.IsNullOrEmpty(responseMessage.Message))
return new ServiceResponse<IEnumerable<Scanner>>
{
ErrorMessage = responseMessage.Message,
Success = false
};
else
return new ServiceResponse<IEnumerable<Scanner>>
{
ErrorMessage = response.ErrorMessage,
Success = false
};
}
}
public ServiceResponse<string> OpenScanningSession(ScannerType scannerType, Scanner scanner)
{
if (!Connectivity.IsConnected)
{
return new ServiceResponse<string>
{
ErrorMessage = "No internet connection.",
Success = false
};
}
var request = new RestRequest("scan/openscanningsession", Method.POST);
request.AddHeader("SessionId", SessionId);
request.AddParameter("ScannerType", scannerType.ToString());
request.AddParameter("ScannerId", scanner.Id);
var response = RestClient.Execute<OpenScanningSessionResponse>(request);
if (response.IsSuccessful)
{
return new ServiceResponse<string>
{
Data = response.Data.ScanningSession,
Success = true
};
}
else
{
var responseMessage = JsonUtils.DeserializeAnonymousType(response.Content, new { Message = "" });
if (!string.IsNullOrEmpty(responseMessage.Message))
return new ServiceResponse<string>
{
ErrorMessage = responseMessage.Message,
Success = false
};
else
return new ServiceResponse<string>
{
ErrorMessage = response.ErrorMessage,
Success = false
};
}
}
public ServiceResponse<ScanBarcodeResult> ScanBarcode(string barcode, string scanningSession, ScanAction scanAction)
{
if (!Connectivity.IsConnected)
{
return new ServiceResponse<ScanBarcodeResult>
{
ErrorMessage = "No internet connection.",
Success = false
};
}
var request = new RestRequest("scan/scanbarcode", Method.POST);
request.AddParameter("Barcode", barcode);
request.AddParameter("ScanningSession", scanningSession);
request.AddParameter("ScanAction", scanAction.ToString());
var response = RestClient.Execute<ScanBarcodeResult>(request);
if (response.IsSuccessful)
return new ServiceResponse<ScanBarcodeResult>
{
Data = response.Data,
Success = true
};
else
return new ServiceResponse<ScanBarcodeResult>
{
ErrorMessage = response.ErrorMessage,
Success = false
};
}
}
ServiceResponse
classes:
class ServiceResponse
{
public bool Success { get; set; }
public string ErrorMessage { get; set; }
}
class ServiceResponse<T>
{
public bool Success { get; set; }
public string ErrorMessage { get; set; }
public T Data { get; set; }
}
ServiceResponse
field/constant which is returned if!Connectivitiy.IsConnected
is false. Similarly, it might be worth creating a small helper method which takes in all of the required properties for creating a newRestRequest
as well as an unknown number of header arguments (params might help with this). \$\endgroup\$ – Danny Goodall May 30 '18 at 10:43