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 类型的程序集中所有类型的重复注册
  • 是否所有用于标识“程序集中的所有类型”的类型都在单独的程序集中