33

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

タイプ 'LM.AM.Core.Services.EmailService' の 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' で見つかったコンストラクターは、利用可能なサービスとパラメーターで呼び出すことができません: パラメーター '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 をできる限り詳しく調べましたが、何らかの理由でパラメーターが唯一のコンストラクターで解決されず、上記のエラーが発生しています。

これは非常に簡単に実行できるはずです。これを機能させるために私ができることについて、誰かが提案を提供できますか?

4

3 に答える 3

31

あなたはEmailService 2回登録しました。

1回はweb.configで、もう1回は

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

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

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

Core.ModuleInstaller複数の場所を使用していて、EmailServiceそこに登録する必要がある場合は、モジュールの読み込み順序を変更する必要があります。

var builder = new ContainerBuilder();
builder.RegisterModule<Core.ModuleInstaller>();
builder.RegisterModule(new ConfigurationSettingsReader("autofac"));

または、 の登録が既に存在する場合Autofacは上書きしないように指示します。EmailServicePreserveExistingDefaults

builder.RegisterType<EmailService>().As<IEmailService>()
       .SingleInstance().PreserveExistingDefaults();
于 2013-04-15T05:43:49.450 に答える
0

私の登録はすべて良好でしたが、コンストラクターでインターフェイスではなく具象クラスを参照していました - 「I」を見逃していました。この回答が、誰かが 1 日 5 分の労力を節約するのに役立つことを願っています。

于 2021-07-22T15:06:10.490 に答える