Ни один из конструкторов, найденный с 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'
Когда я пытаюсь установить PARAMETER с помощью Xml-конфигурации, я получаю следующую ошибку:
Ни один из конструкторов, найденных с 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' по типу "LM.AM.Core.Services.EmailService" можно вызвать с помощью доступного услуг и параметров: невозможно разрешить параметр "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>
Класс обслуживания
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 как можно ближе, но по какой-то причине параметр не разрешает единственный конструктор, и я получаю вышеупомянутую ошибку.
Это должно быть довольно просто. Может ли кто-нибудь дать некоторые предложения о том, что я
может попытаться заставить это работать?
Ответы
Ответ 1
Вы дважды зарегистрировали свой EmailService
.
Один раз в web.config и один раз с
builder.RegisterType<EmailService>().As<IEmailService>().SingleInstance();
Если у вас есть строка выше в Core.ModuleInstaller
, а затем , она переопределит конфигурацию web.config. И поскольку здесь вы не указали параметр Autofac, генерирует исключение.
Итак, чтобы решить эту проблему , просто удалите EmailService
registration из модуля 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();
Ответ 2
Я создал конструктор, где раньше не было и сделал его закрытым, поэтому был конструктор по умолчанию, поэтому я получил эту ошибку. Должен сделать мой конструктор общедоступным.
Ответ 3
После отмены мой редактор VisualStudio все еще знал этот файл, а мой исполняемый код - нет. Мне пришлось добавить файл в проект (снова).
TL;DR: Где это пошло не так?
Я добавил файл класса, но позже отменил все (вместо некоторых) изменения в файле проекта (после включения слишком большого количества пакетов). Это случайно удалило файл из проекта (файл), хотя все еще присутствует на диске и все еще открывается в моем VS-редакторе.
Я не получил никаких ошибок компиляции, потому что у нас есть общая регистрация на основе типов. Что-то вроде этого:
var myTypes =
from assembly in myAssemblies
from type in assembly.GetTypes()
where ...;
foreach (var myImplementation in myTypes)
{
builder.RegisterGeneric(myImplementation).As(typeof(IMyInterface<>));
}