Reputation: 71
I am calling multiple methods of a single web service. For every method, i need to create a unique request and have to pass site credentials and user credentials everytime which is a very repetitive task. Please find the code below.
ClientService.AddOrUpdateClientsRequest clientRequest = new ClientService.AddOrUpdateClientsRequest();
// Create and fill credentials
clientRequest.SourceCredentials = new ClientService.SourceCredentials();
clientRequest.SourceCredentials.SourceName = sourcename;
clientRequest.SourceCredentials.Password = password;
clientRequest.SourceCredentials.SiteIDs = siteIDs;
clientRequest.UserCredentials = new ClientService.UserCredentials();
clientRequest.UserCredentials.Username = "Siteowner";
clientRequest.UserCredentials.Password = "apitest1234";
clientRequest.UserCredentials.SiteIDs = siteIDs;
ClientService.AddOrUpdateClientsRequest updateClientRequest = new ClientService.AddOrUpdateClientsRequest();
// Create and fill credentials
updateClientRequest.SourceCredentials = new ClientService.SourceCredentials();
updateClientRequest.SourceCredentials.SourceName = sourcename;
updateClientRequest.SourceCredentials.Password = password;
updateClientRequest.SourceCredentials.SiteIDs = siteIDs;
updateClientRequest.UserCredentials = new ClientService.UserCredentials();
updateClientRequest.UserCredentials.Username = "Siteowner";
updateClientRequest.UserCredentials.Password = "apitest1234";
updateClientRequest.UserCredentials.SiteIDs = siteIDs;
ClientService.UploadClientDocumentRequest uploadRequest = new ClientService.UploadClientDocumentRequest();
// Assign credentials for UploadClientDocumentRequest object
How can i create a generic function to assign values to same credentials fields but different type of objects. I was looking at using reflection but didn't get anything online
Upvotes: 0
Views: 132
Reputation: 151588
There's no need to use reflection. WCF proxy classes are generated as partials, so you can create a an interface to apply to all DTOs which contain these properties:
public interface IAuthorizedRequest
{
SourceCredentials SourceCredentials { get; set; }
UserCredentials UserCredentials { get; set; }
}
Then in a new or the same file, apply this interface to all those DTO classes:
// Merely apply the interface, the other partial contains the properties
public partial class AddOrUpdateClientsRequest : IAuthorizedRequest { }
public partial class SomeOtherRequest : IAuthorizedRequest { }
Then you can create a method which applies the credentials to any IAuthorizedRequest
:
public void ApplyCredentials(IAuthorizedRequest request)
{
request.SourceCredentials = new ClientService.SourceCredentials();
request.SourceCredentials.SourceName = sourcename;
request.SourceCredentials.Password = password;
request.SourceCredentials.SiteIDs = siteIDs;
request.UserCredentials = new ClientService.UserCredentials();
request.UserCredentials.Username = "Siteowner";
request.UserCredentials.Password = "apitest1234";
request.UserCredentials.SiteIDs = siteIDs;
}
And then call it like this:
var request = new AddOrUpdateClientsRequest();
ApplyCredentials(request);
Upvotes: 2