0

班上

public class CustomerRepository : ICustomer
{
   public CustomerRepository(IEmailManager emailManager)
   {
     ...
   }
}

Autofac 配置

var builder = new ContainerBuilder();

builder.RegisterModule<AutofacWebTypesModule>();

builder.RegisterType<EmailManager>()
        .As<IEmailManager>()
        .SingleInstance();

builder.RegisterType<CustomerRepository>()
        .As<ICustomer>();

foreach (var assembly in assemblies)
{
    builder.RegisterAssemblyTypes(assembly)
            .Except<CustomerRepository>()
            .Where(t => t.Name.EndsWith("Repository"))
            .AsImplementedInterfaces();
}

var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

让我们忽略存储库不应该向客户发送电子邮件。不是我的代码。它正在重构。

如果我使用 foreach 循环注册程序集类型,则在创建 CustomerRepository 时,电子邮件管理器始终为空。

如果我删除循环以注册程序集类型,则会使用有效的电子邮件管理器创建 CustomerRepository。

为什么调用 RegisterAssemblyTypes 会阻止创建电子邮件管理器?

我尝试过的事情,

  1. 首先注册程序集类型。然后是个别类型。
  2. 从 RegisterAssemblyTypes 查询中删除 except 子句。
  3. 在没有 SingleInstance 约束的情况下注册 EmailManager。
4

1 回答 1

0

CustomerRepository 类有两个构造函数,我完全错过了第二个构造函数。当我注册另一种类型时,Autofac(和 Unity)使用了参数最多的构造函数,并绕过了我期望使用的构造函数。EmailManager 从未被注入,因为它不在第二个构造函数中。

于 2019-07-17T17:48:17.090 回答