autofac を IOC コンテナーとして使用して asp.net mvc プロジェクトに取り組んでいます。以下に示すように、 IDependencyBuilder インターフェイスがあります。
public interface IDependencyBuilder
{
void Build(ContainerBuilder builder);
}
現在、私のクライアント プロジェクトは、何らかの実装を提供する必要がある場合、このインターフェイスを実装しています。例えば。
public class SomeDependencyBuilder : IDependencyBuilder
{
public void Build(ContainerBuilder builder)
{
builder.RegisterType<FeedService>().As<IFeedService>();
}
}
さて、私の起動手順です。IDependencyBuilder のすべてのインスタンスを取得し、Build メソッドを呼び出します
public static void BuildModule(ContainerBuilder builder)
{
var type = typeof(IDependencyBuilder);
var types = AssemblyLocator.GetBinFolderAssemblies().ToList()
.SelectMany(s => s.GetTypes())
.Where(p => type.IsAssignableFrom(p) && !p.IsInterface && !p.IsAbstract);
foreach (var type in types)
{
((IDependencyBuilder)Activator.CreateInstance(type)).Build(builder);
}
}
すべてが完璧に機能します。問題は、すべてのクライアント プロジェクトで Autofac ライブラリ プロジェクトへの参照を追加する必要があることです。また、autofac を他の IOC コンテナーに置き換える必要がある場合は、すべてのコードを変更する必要があります。それで気分が悪くなります。私が達成したいのは、クライアント プロジェクトからオブジェクト (実装とインターフェイス) のリストを返し、それらをスタートアップ関数に登録することです。
public interface IDependencyBuilderNew
{
List<SomeObject> GetList();
}
これで、スタートアップ関数は次のようになります
public static void BuildModule(ContainerBuilder builder)
{
var type = typeof(IDependencyBuilderNew);
var types = AssemblyLocator.GetBinFolderAssemblies().ToList()
.SelectMany(s => s.GetTypes())
.Where(p => type.IsAssignableFrom(p) && !p.IsInterface && !p.IsAbstract);
foreach (var type in types)
{
var list =((IDependencyBuilderNew)Activator.CreateInstance(type)).GetList();
foreach(var l in list)
{
builder.RegisterType<l.Class>().As<l.InterFace>();
}
}
}
SomeObject を実装するにはどうすればよいですか。同様の状況でのベスト プラクティスは何ですか。
ありがとう
パーミンダー