未找到“Autofac.Core.Activators.Reflection.DefaultConstructorFinder”的构造函数

问题描述 投票:0回答:5

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

在类型上找不到带有“Autofac.Core.Activators.Reflection.DefaultConstructorFinder”的构造函数 可以使用可用的调用“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,但由于某种原因,该参数无法在唯一的构造函数上解析,并且我收到了上述错误。

这应该很简单。任何人都可以提供一些关于我的建议 可以尝试让它工作吗?

c# autofac
5个回答
32
投票

您已注册您的

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



8
投票


1
投票


0
投票

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

希望这有帮助!


0
投票

不使用构造函数参数作为接口(不好):

`命名空间 Acme.Services { 公共类 MyWebHookHandler :IMyWebHookHandler { 私有只读 HttpClientFactory _httpClientFactory;

public static IServiceCollection YourServiceCollectionExtensionMethod(this IServiceCollection services) { services.AddTransient<IEmailService, EmailService>(); }

}
`:

使用构造函数参数作为接口(好):

`命名空间 Acme.Services { 公共类 MyWebHookHandler :IMyWebHookHandler { 私有只读 IHttpClientFactory _httpClientFactory;

public MyWebHookHandler(HttpClientFactory _httpClientFactory) { _httpClientFactory = httpClientFactory; } }

}
`:

如果这篇文章对您有帮助,请对其进行排名。

© www.soinside.com 2019 - 2024. All rights reserved.