33

当我尝试使用 Xml 配置设置参数时,出现以下错误:

无法使用可用服务和参数调用类型为“LM.AM.Core.Services.EmailService”的“Autofac.Core.Activators.Reflection.DefaultConstructorFinder”的构造函数:无法解析参数“System.String testSmtp”构造函数'Void .ctor(System.String)'。

以下是相关文件:

网络配置

  <configSections>
    <section name="autofac" type="Autofac.Configuration.SectionHandler, Autofac.Configuration" />
  </configSections>

  <autofac>
    <components>
      <component type="LM.AM.Core.Services.EmailService , LM.AM.Core" service="LM.AM.Core.Infrastructure.Services.IEmailService , LM.AM.Core.Infrastructure">
        <parameters>
          <parameter name="testSmtp" value="abc" />
        </parameters>
      </component>
    </components>
  </autofac>

服务等级

public class EmailService : IEmailService
{
    public string _testSmtp;

    public EmailService (string testSmtp)
    {
        _testSmtp = testSmtp;
    }
}

登记

builder.RegisterType<EmailService>().As<IEmailService>().SingleInstance();

全球.asax

var builder = new ContainerBuilder();
builder.RegisterModule(new ConfigurationSettingsReader("autofac"));

builder.RegisterModule<Core.ModuleInstaller>();

builder.RegisterControllers(typeof(MvcApplication).Assembly);
AutofacContainer.Container = builder.Build();

var emailSvc = AutofacContainer.Container.Resolve<IEmailService>();

我已经检查了容器是否知道 xml 参数,并且我已经尽可能地关注 Wiki,但是由于某种原因,该参数没有在唯一的构造函数上解析,并且我收到了上述错误。

这应该很容易上手。任何人都可以就我可以尝试使其正常工作提供一些建议吗?

4

3 回答 3

31

你已经注册了你的EmailService 两次。

一次在 web.config 和一次

builder.RegisterType<EmailService>().As<IEmailService>().SingleInstance();

如果您有上面的行,Core.ModuleInstaller那么它将覆盖 web.config 配置。而且因为这里你没有指定参数 Autofac 会抛出异常。

所以要解决这个问题,只需从模块中删除EmailService注册。Core.ModuleInstaller

如果您使用Core.ModuleInstaller多个地方并且需要在EmailService那里进行注册,那么您需要更改模块加载的顺序:

var builder = new ContainerBuilder();
builder.RegisterModule<Core.ModuleInstaller>();
builder.RegisterModule(new ConfigurationSettingsReader("autofac"));

或者告诉Autofac不要覆盖EmailService它是否已经存在的注册PreserveExistingDefaults

builder.RegisterType<EmailService>().As<IEmailService>()
       .SingleInstance().PreserveExistingDefaults();
于 2013-04-15T05:43:49.450 回答
8

我创建了一个之前没有的构造函数并将其设为私有,因此有默认构造函数,所以我收到了这个错误。不得不公开我的构造函数。

于 2016-03-17T08:44:03.567 回答
0

我的注册都很好,但是我在构造函数中引用了具体类而不是接口 - 错过了“我”。希望这个答案可以帮助某人每天节省 5 分钟的精力。

于 2021-07-22T15:06:10.490 回答