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を追跡しましたが、何らかの理由でパラメーターが唯一のコンストラクターで解決されず、上記のエラーが表示されます。
これは簡単に始められるはずです。誰かが私がこれを機能させるために試みることができるものについていくつかの提案を提供できますか?
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();
以前は何もなかったコンストラクターを作成し、それをプライベートにしました。したがって、デフォルトのコンストラクターがあるため、このエラーが発生しました。コンストラクタを公開する必要がありました。
元に戻した後、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に対する答えではありませんが、おそらく同じ症状を持つ人もここに来るでしょう。