Подтвердить что ты не робот

Ни один из конструкторов, найденный с '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 как можно ближе, но по какой-то причине параметр не разрешает единственный конструктор, и я получаю вышеупомянутую ошибку.

Это должно быть довольно просто. Может ли кто-нибудь дать некоторые предложения о том, что я может попытаться заставить это работать?

4b9b3361

Ответ 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<>));
        }