10

この質問は StructureMap に関連していますが、私の一般的な質問は次のとおりです。

( xml経由で構成するのではなく)コードで IoC コンテナーを使用してコンポーネントを接続する場合、通常、すべてのアセンブリへの明示的なプロジェクト/ビルド参照が必要ですか?

なぜ別々のアセンブリですか?なぜなら:


「具体的な実装とは別のアセンブリに存在する抽象クラスは、そのような分離を実現する優れた方法です。」-フレームワーク設計ガイドライン p.91


例:

PersonBase.dllBob.dllがあるとします。

Bobは、抽象クラスPersonBaseから継承します。どちらもPerson名前空間にあります。しかし、別のアセンブリで

BobではなくPersonBaseにプログラミングしています。

メインコードに戻ると、人が必要です。StructureMap はアセンブリをスキャンできます。よし、StructureMap に頼んでみよう!

さて、私のメイン コードでは、もちろん、 BobではなくPersonBaseのみを参照しています。実際、自分のコードでBobについて何も知りたくありません。プロジェクトの参照も、nuthin もありません。それが要点です。

だから私は言いたい:

//Reference: PersonBase.dll (only)
using Person;  
...

//this is as much as we'll ever be specific about Bob:
Scan( x=> { x.Assembly("Bob.dll"); }

//Ok, I should now have something that's a PersonBase (Bob). But no ?
ObjectFactory.GetAllInstances<PersonBase>().Count == 0

運がない。うまくいくのは、私がボブを欲しがっていることを明示することです:

//Reference: PersonBase.dll and Bob.dll
using Person; 
...
Scan( x => {x.Assembly("Bob.dll"); }

//If I'm explicit, it works. But Bob's just a PersonBase, what gives?
ObjectFactory.GetAllInstances<Bob>().Count == 1 //there he is!

しかし今、プロジェクトでBob.dllを参照する必要がありましたが、これはまさに私が望んでいなかったものです。

Spring + Xml 構成を使用して、この状況を回避できます。しかし、Spring + Xml 構成に戻ります ... !

StructureMap を使用して何か不足していますか、または一般的な原則として、(流暢な) IC 構成にはすべてのアセンブリへの明示的な参照が必要ですか?

おそらく関連する質問:StructureMap とスキャン アセンブリ

4

4 に答える 4

15

私はついにこれを整理しました。次のようになります。

IoC Uml http://img396.imageshack.us/img396/1343/iocuml.jpg

アセンブリと

  • Core.exe
  • PersonBase.dll (Core.exeによるコンパイル時間の参照)
  • Bob.dll ( StructureMap スキャンを介し て実行時に読み込まれます)
  • Betty.dll ( StructureMap スキャンを介し て実行時に読み込まれます)

StructureMap で取得するには、アセンブリのスキャンをサポートするカスタムの「ITypeScanner」が必要でした。

public class MyScanner : ITypeScanner {
  public void Process(Type type, PluginGraph graph) {

    if(type.BaseType == null) return;

    if(type.BaseType.Equals(typeof(PersonBase))) {
      graph.Configure(x => 
        x.ForRequestedType<PersonBase>()
        .TheDefault.Is.OfConcreteType(type));
    }
  }
} 

したがって、私のメインコードは次のようになります。

ObjectFactory.Configure(x => x.Scan (
  scan =>
  {
    scan.AssembliesFromPath(Environment.CurrentDirectory 
    /*, filter=>filter.You.Could.Filter.Here*/);

    //scan.WithDefaultConventions(); //doesn't do it

    scan.With<MyScanner>();
  }
));

ObjectFactory.GetAllInstances<PersonBase>()
 .ToList()
  .ForEach(p => 
  { Console.WriteLine(p.FirstName); } );
于 2009-05-03T05:04:14.280 に答える
1

StructureMap を使用して xml 構成を行うこともできます。必要に応じて、それらを混合することもできます。

アセンブリのロード方法を StructureMap に伝えるために、Bob クラスに配置できる StructureMap 属性もあります。DefaultConstructor は、私が時々使用することになるものです。

于 2009-04-30T21:12:09.877 に答える
0

自動スキャン オプションは、命名、アセンブリ、および名前空間の規則を守っている場合にのみ機能します。流暢なインターフェイスで構造マップを手動で構成できます。例:

ObjectFactory.Initialize(initialization => 
   initialization.ForRequestedType<PersonBase>()
    .TheDefault.Is.OfConcreteType<Bob>());
于 2009-04-30T21:25:12.060 に答える