使用'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'找到的构造函数都没有

Dio*_*ion 28 autofac

当我尝试使用Xml配置设置PARAMETER时,我收到以下错误:

在'LM.AM.Core.Services.EmailService'类型的'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'中找到的构造函数都不能使用可用的服务和参数调用:无法解析参数'System.String testSmtp'的构造函数'Void .ctor(System.String)'.

以下是相关文件:

web.config中

  <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>
Run Code Online (Sandbox Code Playgroud)

服务类

public class EmailService : IEmailService
{
    public string _testSmtp;

    public EmailService (string testSmtp)
    {
        _testSmtp = testSmtp;
    }
}
Run Code Online (Sandbox Code Playgroud)

注册

builder.RegisterType<EmailService>().As<IEmailService>().SingleInstance();
Run Code Online (Sandbox Code Playgroud)

Global.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>();
Run Code Online (Sandbox Code Playgroud)

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

这应该很简单.任何人都可以提供一些建议,我可以尝试使其工作吗?

nem*_*esv 24

你已经两次陷入困境EmailService 了.

一旦进入web.config并进行一次

builder.RegisterType<EmailService>().As<IEmailService>().SingleInstance();
Run Code Online (Sandbox Code Playgroud)

如果你在上面有这一行,Core.ModuleInstaller那么它将覆盖web.config配置.因为在这里你还没有指定参数Autofac引发异常.

所以要解决这个问题,只需EmailServiceCore.ModuleInstaller模块中删除注册即可.

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

var builder = new ContainerBuilder();
builder.RegisterModule<Core.ModuleInstaller>();
builder.RegisterModule(new ConfigurationSettingsReader("autofac"));
Run Code Online (Sandbox Code Playgroud)

或告诉Autofac不要覆盖EmailService已存在的注册PreserveExistingDefaults:

builder.RegisterType<EmailService>().As<IEmailService>()
       .SingleInstance().PreserveExistingDefaults();
Run Code Online (Sandbox Code Playgroud)


小智 8

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

  • 哦,上帝,你救了我的命! (3认同)