Autofac 正在解决重复的实例
Autofac is resolving duplicate instances
我想使用 Autofac 获取特定命令的所有验证器的列表。我创建了一个界面
public interface IValidate<T>
{
void Validate(T command);
}
并且我已经为此接口实现了 2 个验证器
public class ValidateRule1 : IValidate<CreateEnrollmentCommand>
{
public void Validate(CreateEnrollmentCommand command)
{
}
}
public class ValidateRule2 : IValidate<CreateEnrollmentCommand>
{
public void Validate(CreateEnrollmentCommand command)
{
}
}
我正在像这样在 IEnumerable 中注入这些验证器
public class MyCommandHandler
{
private readonly IRepository _repository;
private readonly IEnumerable<IValidate<CreateEnrollmentCommand>> _validators;
public MyCommandHandler(IEnrollmentRepository enrollmentRepository, IEnumerable<IValidate<CreateEnrollmentCommand>> validators)
{
_enrollmentRepository = enrollmentRepository;
_validators = validators;
}
}
这是我的 Autofac 配置
public class AutofacModule : Module
{
protected override void Load(ContainerBuilder builder)
{
// Register API Assembly
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
.AsImplementedInterfaces();
// Register Data Access
var api = typeof(CreateStudentCommand).Assembly;
builder.RegisterAssemblyTypes(api)
.AsImplementedInterfaces();
// Register Data Access
var dataAccess = typeof(StudentRepository).Assembly;
builder.RegisterAssemblyTypes(dataAccess)
.AsImplementedInterfaces();
builder
.RegisterType<Mediator>()
.As<IMediator>()
.InstancePerLifetimeScope();
builder.Register<ServiceFactory>(context =>
{
var c = context.Resolve<IComponentContext>();
return t => c.Resolve(t);
});
builder.RegisterAssemblyTypes(typeof(CreateStudentCommand).GetTypeInfo().Assembly).AsImplementedInterfaces(); // via assembly scan
}
}
我期待 Autofac 注入两个验证器,但它实际上为每个验证器注入了 2 个实例。我在 IEnumerable 属性 中得到总共 4 个验证器实例。知道我做错了什么吗?
编辑:
正如@Lasse V. Karlsen
指出的那样,IValidate 接口和验证器都位于同一个程序集中
您有几个调用可以在一个程序集中注册所有类型,特别是我会检查:
- 包含
CreateStudentCommand
类型的程序集中所有类型的重复注册
- 是否所有用于标识“程序集中的所有类型”的类型都在单独的程序集中
我想使用 Autofac 获取特定命令的所有验证器的列表。我创建了一个界面
public interface IValidate<T>
{
void Validate(T command);
}
并且我已经为此接口实现了 2 个验证器
public class ValidateRule1 : IValidate<CreateEnrollmentCommand>
{
public void Validate(CreateEnrollmentCommand command)
{
}
}
public class ValidateRule2 : IValidate<CreateEnrollmentCommand>
{
public void Validate(CreateEnrollmentCommand command)
{
}
}
我正在像这样在 IEnumerable 中注入这些验证器
public class MyCommandHandler
{
private readonly IRepository _repository;
private readonly IEnumerable<IValidate<CreateEnrollmentCommand>> _validators;
public MyCommandHandler(IEnrollmentRepository enrollmentRepository, IEnumerable<IValidate<CreateEnrollmentCommand>> validators)
{
_enrollmentRepository = enrollmentRepository;
_validators = validators;
}
}
这是我的 Autofac 配置
public class AutofacModule : Module
{
protected override void Load(ContainerBuilder builder)
{
// Register API Assembly
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
.AsImplementedInterfaces();
// Register Data Access
var api = typeof(CreateStudentCommand).Assembly;
builder.RegisterAssemblyTypes(api)
.AsImplementedInterfaces();
// Register Data Access
var dataAccess = typeof(StudentRepository).Assembly;
builder.RegisterAssemblyTypes(dataAccess)
.AsImplementedInterfaces();
builder
.RegisterType<Mediator>()
.As<IMediator>()
.InstancePerLifetimeScope();
builder.Register<ServiceFactory>(context =>
{
var c = context.Resolve<IComponentContext>();
return t => c.Resolve(t);
});
builder.RegisterAssemblyTypes(typeof(CreateStudentCommand).GetTypeInfo().Assembly).AsImplementedInterfaces(); // via assembly scan
}
}
我期待 Autofac 注入两个验证器,但它实际上为每个验证器注入了 2 个实例。我在 IEnumerable 属性 中得到总共 4 个验证器实例。知道我做错了什么吗?
编辑: 正如@Lasse V. Karlsen
指出的那样,IValidate 接口和验证器都位于同一个程序集中您有几个调用可以在一个程序集中注册所有类型,特别是我会检查:
- 包含
CreateStudentCommand
类型的程序集中所有类型的重复注册 - 是否所有用于标识“程序集中的所有类型”的类型都在单独的程序集中