一次配置一组类型注册



在我的代码中,当前类型注册了大量重复的代码,例如

builder.RegisterType<UserViewModelValidation>()
    .As<IValidator<UserViewModel>>()
    .PropertiesAutowired().InstancePerLifetimeScope();
builder.RegisterType<RoleValidation>()
    .As<IValidator<Role>>()
    .PropertiesAutowired().InstancePerLifetimeScope();

没有办法配置一组注册,而不必逐个配置这些注册中的每一个?

因此,在上面的代码中,它专门用于一组类型注册的 PropertiesAutowired() 函数和 InstancePerLifetimeScope() 函数。

您可以创建一个自定义扩展方法,该方法将执行所需的操作。

public static class RegistrationExtensions
{
    public static IRegistrationBuilder<TValidator, ConcreteReflectionActivatorData, SingleRegistrationStyle> 
        RegisterValidator<TValidator, TViewModel>(this ContainerBuilder builder)
    {
        return builder.RegisterType<TValidator>()
                      .As<IValidator<TViewModel>>()
                      .PropertiesAutowired()
                      .InstancePerLifetimeScope();
    }
}

然后像这样注册您的类型:

builder.RegisterValidator<UserViewModelValidation, UserViewModel>();
builder.RegisterValidator<RoleValidation, Role>();

除了 Cyril 的回答之外,我还创建了一些额外的扩展,用于使用 Autofac 在我的应用程序中注册类型。

public static IRegistrationBuilder<T, ConcreteReflectionActivatorData, SingleRegistrationStyle>
    RegisterInstance<T, TServiceType>(this ContainerBuilder builder)
{
    return builder.RegisterType<T>().As<TServiceType>().InstancePerLifetimeScope();
}
public static IRegistrationBuilder<T, ConcreteReflectionActivatorData, SingleRegistrationStyle>
    RegisterAutowiredInstance<T>(this ContainerBuilder builder)
{
    return builder.RegisterType<T>().PropertiesAutowired().InstancePerRequest();
}
public static IRegistrationBuilder<object, ReflectionActivatorData, DynamicRegistrationStyle>
    RegisterGenericInstance(this ContainerBuilder builder, Type type, Type serviceType)
{
    return builder.RegisterGeneric(type).As(serviceType).InstancePerRequest();
}

使用示例:

builder.RegisterInstance<UnitOfWork, IUnitOfWork>();
builder.RegisterAutowiredInstance<Authorize>();
builder.RegisterGenericInstance(typeof(EntityBaseRepository<>), typeof(IEntityBaseRepository<>));

有助于在注册新类型时减少冗余代码和键入的数量。

最新更新