在我的代码中,当前类型注册了大量重复的代码,例如
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<>));
有助于在注册新类型时减少冗余代码和键入的数量。