web-dev-qa-db-ja.com

'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'で見つかったコンストラクターはありません

Xml構成を使用してPARAMETERを設定しようとすると、次のエラーが表示されます。

タイプ 'LM.AM.Core.Services.EmailService'の 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'で見つかったコンストラクターは、利用可能なサービスとパラメーターで呼び出すことはできません。コンストラクター 'Void .ctor(System.String)'のパラメーター '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を追跡しましたが、何らかの理由でパラメーターが唯一のコンストラクターで解決されず、上記のエラーが表示されます。

これは簡単に始められるはずです。誰かが私がこれを機能させるために試みることができるものについていくつかの提案を提供できますか?

26
Dion

EmailServiceを2回登録しました。

Web.configに1回、次に1回

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

Core.ModuleInstallerに上記の行がある場合、web.config構成がオーバーライドされます。ここでパラメーターを指定していないため、Autofacは例外をスローします。

したがって、これを解決するにはCore.ModuleInstallerモジュールからEmailService登録を削除するだけです

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();
22
nemesv

以前は何もなかったコンストラクターを作成し、それをプライベートにしました。したがって、デフォルトのコンストラクターがあるため、このエラーが発生しました。コンストラクタを公開する必要がありました。

7

元に戻した後、VisualStudioエディターはファイルを認識していましたが、実行中のコードは認識していませんでした。ファイルをプロジェクトに追加する必要がありました(もう一度)。

TLDR:どこでうまくいかなかったのですか?

クラスファイルを追加しましたが、後で(あまりにも多くのパッケージを含めた後)プロジェクトファイルに(一部ではなく)すべての変更を元に戻しました。これにより、誤ってファイルがプロジェクト(ファイル)から削除されましたが、ディスク上にまだ存在していますおよび 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に対する答えではありませんが、おそらく同じ症状を持つ人もここに来るでしょう。

0
Yahoo Serious