使用泛型来减少重复代码-接受两个泛型参数的方法



我有一个方法,它有一组重复的语句,这些语句要求重构,但我不知道如何生成应该执行重复任务的方法的参数。

这是我的代码:

private void RegisterServices(IServiceCollection services)
{
services.AddTransient<CommonApiMessageHandler>();
var baseAddress = Configuration["ApiSetup:BaseAddress"];
services.AddHttpClient<ILookupService, LookupService>("Api.Lookup", client =>
{
client.BaseAddress = new Uri(baseAddress);
}).AddHttpMessageHandler<CommonApiMessageHandler>();
services.AddHttpClient<IBusinessLookupService, BusinessLookupService>("Api.Lookup", client =>
{
client.BaseAddress = new Uri(baseAddress);
}).AddHttpMessageHandler<CommonApiMessageHandler>();
services.AddHttpClient<IApiUserService, ApiUserService>("Api.ApiUser", client =>
{
client.BaseAddress = new Uri(baseAddress);
}).AddHttpMessageHandler<CommonApiMessageHandler>();
services.AddHttpClient<IRequestService, RequestService>("Api.Request", client =>
{
client.BaseAddress = new Uri(baseAddress);
}).AddHttpMessageHandler<CommonApiMessageHandler>();
services.AddHttpClient<IResourceService, ResourceService>("Api.Resource", client =>
{
client.BaseAddress = new Uri(baseAddress);
}).AddHttpMessageHandler<CommonApiMessageHandler>();
services.AddHttpClient<IApproverTemplateService, ApproverTemplateService>("Api.ApproverTemplate", client =>
{
client.BaseAddress = new Uri(baseAddress);
}).AddHttpMessageHandler<CommonApiMessageHandler>();
services.AddHttpClient<IAttachmentService, AttachmentService>("Api.Attachment", client =>
{
client.BaseAddress = new Uri(baseAddress);
}).AddHttpMessageHandler<CommonApiMessageHandler>();
services.AddHttpClient<IDacBudgetService, DacBudgetServiceClient>("Api.DaCBudget", client =>
{
client.BaseAddress = new Uri(baseAddress);
}).AddHttpMessageHandler<CommonApiMessageHandler>();
}

我觉得应该是:

private static void NewMethod(IServiceCollection services, string baseAddress, Generic T, Generic U)
{
services.AddHttpClient<T, U>("Api.Lookup", client =>
{
client.BaseAddress = new Uri(baseAddress);
}).AddHttpMessageHandler<CommonApiMessageHandler>();
}

这可能吗?

您不仅可以使用泛型,还可以将其定义为扩展方法,因此您可以像调用其他服务一样调用它。

public static class MyExtensions
{
public static IServiceCollection AddMyService<TInterface,TImplementation>(this IServiceCollection services, string serviceName, string baseAddress)
where TInterface: class 
where TImplementation : class, TInterface
{
services.AddHttpClient<TInterface, TImplementation>(serviceName, client =>
{
client.BaseAddress = new Uri(baseAddress);
}).AddHttpMessageHandler<CommonApiMessageHandler>();
return services;
}
}

这样称呼它:

services.AddMyService<IApiUserService, ApiUserService>("Api.ApiUser", baseAddress);
services.AddMyService<IRequestService, RequestService>("Api.Request", baseAddress);
//etc....

或者,由于我们返回IServiceCollection,您可以将它们链接起来:

services
.AddMyService<IApiUserService, ApiUserService>("Api.ApiUser", baseAddress)
.AddMyService<IRequestService, RequestService>("Api.Request", baseAddress);

最新更新