表示多个通用实现的更好方式

本文关键字:更好 方式 实现 表示 | 更新日期: 2023-09-27 17:57:59

不太确定如何命名。我有以下代码:

builder.Register(context =>
{
    var bus = context.Resolve<IBus>();
    return bus.CreatePublishRequestClient<IGenerateProjectReport, IGenerateReportResult>(MessagingTimeout);
}).As<IRequestClient<IGenerateProjectReport, IGenerateReportResult>>();
builder.Register(context =>
{
    var bus = context.Resolve<IBus>();
    return bus.CreatePublishRequestClient<IGenerateInstanceReport, IGenerateReportResult>(MessagingTimeout);
}).As<IRequestClient<IGenerateInstanceReport, IGenerateReportResult>>();
builder.Register(context =>
{
    var bus = context.Resolve<IBus>();
    return bus.CreatePublishRequestClient<IGenerateInternalReport, IGenerateReportResult>(MessagingTimeout);
}).As<IRequestClient<IGenerateInternalReport, IGenerateReportResult>>();

有更好的表达方式吗?看起来有点多余。

编辑:

据我所知,我不能使用注册泛型功能,因为我必须使用另一个注册服务的工厂方法。

表示多个通用实现的更好方式

您可以创建一个自定义扩展方法来注册组件:

我不知道你的类型和类型约束是如何设计的,但有这样的东西:

static class XXXRegistrationExtensions
{
    public static IRegistrationBuilder<PublishRequestClient<TReport>, SimpleActivatorData, SingleRegistrationStyle> RegisterXXX<TReport, TReportResult>(this ContainerBuilder builder)
        where TReport : IXXXReport
        where TReportResult : IXXXReportResult<TReport>
    {
        var registration = builder.Register(context =>
        {
            var bus = context.Resolve<IBus>();
            return bus.CreatePublishRequestClient<TReport, TReportResult>();
        }).As<IRequestClient<TReport, TReportResult>>();
        return registration;
    }
}

然后,您将能够将您的类型注册为:

builder.RegisterXXX<IGenerateInternalReport, IGenerateReportResult>();