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

Use generic to reduce repeated code - Method accepting two generic parameters

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

这是我的代码:

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>();
}

这可能吗?

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

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....

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

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