3

1つのソリューションの異なるプロジェクトからオブジェクトをiocコンテナに登録するためのベストプラクティスを理解しようとしています。複数のアセンブリからのIoCコンテナの登録

私は4つのプロジェクトとソリューションを持っていると私はプロジェクトのそれぞれにインストーラを作成するためのソリューションを見て、このようsomtehing一箇所呼び出し中:

_container = new WindsorContainer(); 
      var assemblyNames = new[] {"Dal", "Utils" }; 
      _container.Install(assemblyNames.Select(
        x => (IWindsorInstaller)new AssemblyInstaller(Assembly.Load(x), 
         new InstallerFactory())).ToArray()); 

しかし、また、私は、各溶液を見ましたプロジェクト、コンテナの作成があり、内部にはこの特定のプロジェクトに関連するオブジェクトの登録があります。

私の質問は:この状況のベストプラクティスは何ですか?

答えて

0

ここには例があります。多くのプロジェクトで構成されたWebソリューション:1つのコアプロジェクトとそのコアを参照する他の多くのプロジェクト。それらはすべて別のフォルダになります(または、必要に応じてコア/ binにビルドした後にコピーされます)。開始時にそれらを動的にロードしてから、それらからIWindsorInstallersをロードします。私たちは、そのようなDLLをロードします。

public static void LoadMoules() 
{    
    string basePath = AppDomain.CurrentDomain.BaseDirectory; 
    string binPath = Path.Combine(basePath, "bin"); 
    DirectoryInfo binFolder = new DirectoryInfo(binPath); 
    IEnumerable<FileInfo> binFiles = binFolder.EnumerateFiles("*.dll", SearchOption.AllDirectories); 
    Assembly[] domainAssemblies = AppDomain.CurrentDomain.GetAssemblies(); 
    try 
    { 
     foreach (var binFile in binFiles) 
     { 
      AssemblyName assemblyName = AssemblyName.GetAssemblyName(binFile.FullName); 
      if (domainAssemblies.All(x => x.FullName != assemblyName.FullName)) 
      { 
       Assembly.Load(assemblyName.FullName); 
       Debug.WriteLine($"Loading {assemblyName.FullName}"); 
      } 
     } 
    } 
    catch (Exception exception) 
    { 
     DynamicModuleLoaderEventSource.Log.FailedToLoadAssembly(exception.Message + exception.StackTrace); 

    } } 

はその後、我々は登録を取得:

try 
    { 
     foreach(Assembly moduleAssembly in installationModules) 
     { 
      // satellite proejct assemblies 

      Debug.WriteLine(moduleAssembly.FullName); 
      ContainerRegisterEventSource.Log.InstallAssembly(moduleAssembly.FullName); 
      container.Install(FromAssembly.Instance(moduleAssembly)); 
     } 

     container.Install(FromAssembly.This()); // the core assembly 
    } 
    catch(Exception exception) 
    { 
     ContainerRegisterEventSource.Log.Exception(exception.Message + exception.StackTrace); 
     Trace.WriteLine("SetupContainerForMigrations error : " + exception.Message + Environment.NewLine + exception.StackTrace); 
    } 

はそれをあなたがすべての依存関係を持つ一つの容器で終わるだろうこの方法を行います。

1

通常、モデル、ライブラリ、他のプロジェクトで使用するIoC設定などの共有リソースのほとんどを含む1つのプロジェクトを作成します。このプロジェクトからIoCコンテナを設定することで、コピー貼り付けを節約できます。これで、この設定を使用しているプロジェクトの設定を上書きすることができます。

結局のところ、保守性についてです。すべてのプロジェクトで同じ依存関係を使用している場合は、それぞれのプロジェクトごとに時間を設定するのが難しいでしょう。

1

すべての実行可能プロジェクトには、他の実行可能プロジェクトとは独立して実行できるため、独自のコンテナが必要です。ライブラリプロジェクトは、通常、実行可能プロジェクトで消費される依存関係を提供します。したがって、独自のコンテナを持たないライブラリでそれらの依存関係を使用したい場合、その依存関係をコンテナに登録するのは実行可能プロジェクトの責任です。

複数のコンテナを持つと、クラスが複数のコンテナを持つシングルトン(依存関係のすべてのコンシューマ間で共有される1つの参照)として登録された場合、そのクラスの複数のインスタンスが作成されます

コンテナが別のコンテナに登録されている依存関係を解決できないため、プロジェクト間の依存関係が存在する場合にも問題が発生する可能性があります。

関連する問題