最近我似乎在处理很多请求/响应的东西,我想创建一些通用的东西。
我有以下内容,但我对创建多个 if 语句不满意,我想避免使用它们。
这个想法是这样的:
无论请求/响应如何处理它们。如何在我的通用请求处理程序中删除这些 if 语句?
代码
class Program
{
private static void Main()
{
IRequestResponseFactory factory = new RequestResponseFactory();
var customerRequest = new CustomerRequest { Name = "Joe", Surname = "Bloggs" };
var customerResponse = factory.ProcessRequest<CustomerRequest, CustomerResponse>(customerRequest);
var billRequest = new BillRequest() { Amount = 100m };
var billResponse = factory.ProcessRequest<BillRequest, BillResponse>(billRequest);
Console.WriteLine(billResponse.Success);
Console.WriteLine(customerResponse.Success);
Console.ReadKey();
}
}
public class CustomerRequest : IRequestData<CustomerResponse>
{
public string Name { get; set; }
public string Surname { get; set; }
}
public class CustomerResponse
{
public bool Success { get; set; }
}
public class BillRequest : IRequestData<BillResponse>
{
public decimal Amount { get; set; }
}
public class BillResponse
{
public bool Success { get; set; }
}
public interface IRequestData<TResponse>
{
}
public interface IRequestHandler<TRequest, TResponse> where TRequest : IRequestData<TResponse>
{
TResponse ProcessRequest(TRequest request);
}
public interface IRequestResponseFactory
{
TResponse ProcessRequest<TRequest, TResponse>(TRequest request) where TRequest : IRequestData<TResponse>;
}
class RequestResponseFactory : IRequestResponseFactory
{
public TResponse ProcessRequest<TRequest, TResponse>(TRequest request) where TRequest : IRequestData<TResponse>
{
var handler = new GenericRequestHandler<TRequest, TResponse>();
TResponse response = handler.ProcessRequest(request);
return response;
}
}
public class GenericRequestHandler<TRequest, TResponse> : IRequestHandler<TRequest, TResponse> where TRequest : IRequestData<TResponse>
{
public TResponse ProcessRequest(TRequest request)
{
var response = default(TResponse);
//How do I avoid this if statements????
if (request is IRequestData<CustomerResponse>)
{
var tempResponse = new CustomerResponse { Success = true };
response = (TResponse)Convert.ChangeType(tempResponse, typeof(TResponse));
return response;
}
if (request is IRequestData<BillResponse>)
{
var tempResponse = new BillResponse { Success = false };
response = (TResponse)Convert.ChangeType(tempResponse, typeof(TResponse));
return response;
}
return response;
}
}