当我尝试使用 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,但由于某种原因,该参数无法在唯一的构造函数上解析,并且我收到了上述错误。
这应该很简单。任何人都可以提供一些关于我的建议 可以尝试让它工作吗?
您已注册您的
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();
希望这有帮助!
不使用构造函数参数作为接口(不好):
`命名空间 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;
}
}
} `:
如果这篇文章对您有帮助,请对其进行排名。