当我尝试使用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,但由于某种原因,参数没有在唯一的构造函数上解析而且我收到了上述错误。
这应该很简单。谁能提供一些关于我的建议 可以尝试让这个工作吗?
答案 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编辑器仍然知道该文件,但是我运行的代码却不知道。 我必须再次将文件添加到项目中。
我已经添加了类文件,但是后来撤消了对项目文件的所有(而不是某些)更改(包括了太多的包之后)。尽管仍然在磁盘上并且仍在我的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 分钟的精力。