提供するサービスを登録する 2 つの異なるモジュール (Autofac.Module として実装) を使用するアプリケーションがあります。それぞれに、異なる方法で同じデータを生成するハードウェア デバイス用のアダプターがあります。
public class AdapterA : IDataProducer {
public AdapterA(IConfigSource conf){
// do something with conf, like setting an IP address, port etc.
}
}
public ModuleA : Module{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<AdapterA>().As<IDataProducer>();
// the config source is specific to Module A, as it contains details about the hardware
builder.Register(c => new IniConfigSource("moduleA.ini")).As<IConfigSource>();
}
}
そのモジュールをメイン アプリケーションに登録すると、正常に動作し、依存関係が正しく解決されます。
builder.RegisterModule<ModuleA>();
私のメイン アプリケーションでは、アプリケーション固有の設定を読み書きするためにも使用します。そこに別の設定ファイルIConfigSource
を登録すると、問題が明らかになります。IConfigSource
protected override void ConfigureContainer(ContainerBuilder builder)
{
builder.RegisterModule<ModuleA>();
builder.Register(c => new IniConfigSource("mainprogram.ini")).As<IConfigSource>();
}
解決時に、2 番目の登録が有効になりModuleA
、間違った構成ファイル リーダーを受け取ります。
解決策を探して、次のように登録タイプを変更してこれを回避しようとしました。
public interface IModuleAConfigSource : IConfigSource {}
と
builder.Register(c => new IniConfigSource("moduleA.ini")).As<IModuleAConfigSource>();
しかし、それは機能しません。Autofac は解決時に、タイプIniconfigSource
がインターフェイス IModuleAConfigSource に割り当てられないことを訴えます。アプリケーションの起動時に単一の関数で登録を行うコンストラクター インジェクションを使用します。
ここでの良い戦略は何でしょうか? これを解決するために具象型を使用できることはわかっていますが、登録をモジュールローカルに保つ方法はありますか?