一部のモジュール自体に依存関係があるため、Autofac コンポーネントの登録をモジュールに整理する方法に苦労しています。
インターフェイスに構成データの抽象化 (つまり、web.config)を実装しました。
interface IConfigurationProvider
{
T GetSection<T>(string sectionName)
where T : System.Configuration.ConfigurationSection;
}
WebConfigurationProvider
ASP.NET ( ) および「デスクトップ」アプリケーション ( )の実装と共にExeConfigurationProvider
。
私の autofac モジュールの中には、IConfigurationProvider
コンストラクターのパラメーターとして を必要とするものもありますが、そうでないものもあります。
class DependentModule : Module
{
public DependentModule(IConfigurationProvider config)
{
_config = config;
}
protected override void Load(ContainerBuilder builder)
{
var configSection = _config.GetSection<CustomConfigSection>("customSection");
builder.RegisterType(configSection.TypeFromConfig);
}
private readonly IConfigurationProvider _config;
}
class IndependentModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.Register(/* other stuff not based on configuration */);
}
}
拡張メソッドは登録デリゲート ( )RegisterType()
を受け入れないため、前もって登録してから、構成で指定された型を登録するときにそれを解決することはできません。たとえば、次のようになります。Func<IComponentContext, T>
Register()
IConfigurationProvider
// this would be nice...
builder.RegisterType(c => c.Resolve<IConfigurationProvider>().GetSection<CustomConfigSection>("sectionName").TypeFromConfig);
これは、依存関係のあるモジュールとないモジュールを登録できる必要があることを意味しますIConfigurationProvider
。
各モジュールを手動でインスタンス化して登録する方法は明らかです。
IConfigurationProvider configProvider = ...;
var builder = new ContainerBuilder();
builder.RegisterModule(new DependentModule(configProvider));
builder.RegisterModule(new IndependentModule());
using (var container = builder.Build())
{
...
}
しかし、モジュールを手動でインスタンス化する必要はありません。モジュールのアセンブリをスキャンし、それらを自動的に登録したいです (この質問で説明したように)。したがって、リフレクションを使用してアセンブリのIModule
型をスキャンし、それを使用Activator.CreateInstance
して登録可能なインスタンスを作成する必要があります。IConfigurationProvider
しかし、コンストラクターのパラメーターとして渡すかどうかはどうすればわかりますか。また、他のモジュールに追加の依存関係または異なる依存関係がある場合はどうなりますか?
基本的なタスクを達成するためのより簡単な方法が必要です。インターフェイスを介して提供される構成で指定された型を登録しますよね? では、どうすればいいですか?