1

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 を実装するにはどうすればよいですか。同様の状況でのベスト プラクティスは何ですか。

ありがとう

パーミンダー

4

1 に答える 1

1
  1. アプリケーションはコンテナーに依存する必要があります。たとえば、アプリの ORM を頻繁に変更しますか? このようなアーキテクチャ上の決定は、事前に行う必要があります。

  2. 具体的な IOC コンテナーを解き放ちたい場合は、Agatha Request/Response Service Layer http://davybrion.github.com/Agatha/を参照してください。

  3. IDependencyBuilder の代わりに Autofac モジュールを使用してください。より柔軟です。 https://code.google.com/p/autofac/wiki/StructuringWithModules

于 2013-03-06T09:34:43.610 に答える