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

时间:2013-04-15 01:13:13

标签: autofac

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

  

没有找到'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'类型的构造函数   可以使用available调用'LM.AM.Core.Services.EmailService'   服务和参数:无法解析参数'System.String   构造函数'void .ctor(System.String)'的testSmtp'。

以下是相关文件:

的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>

服务类

public class EmailService : IEmailService
{
    public string _testSmtp;

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

注册

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

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>();

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

这应该很简单。谁能提供一些关于我的建议 可以尝试让这个工作吗?

4 个答案:

答案 0 :(得分:22)

您已经两次对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();

答案 1 :(得分:7)

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

答案 2 :(得分:0)

撤消后,我的VisualStudio编辑器仍然知道该文件,但是我运行的代码却不知道。 我必须再次将文件添加到项目中。

TLDR:哪里出错了?

我已经添加了类文件,但是后来撤消了对项目文件的所有(而不是某些)更改(包括了太多的包之后)。尽管仍然在磁盘上并且仍在我的VS编辑器中打开,但这会从项目(文件)中意外删除文件。

我没有遇到任何编译错误,因为我们有一个通用的基于类型的注册。像这样:

        var myTypes =
            from assembly in myAssemblies
            from type in assembly.GetTypes()
            where ...;
        foreach (var myImplementation in myTypes)
        {
            builder.RegisterGeneric(myImplementation).As(typeof(IMyInterface<>));
        }

显然不是OP的答案,但也许有相同症状的人也到这里了。

答案 3 :(得分:0)

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