表示多个通用实现的更好方式
本文关键字:更好 方式 实现 表示 | 更新日期: 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>();