StructureMap をブートストラップするとき、私は常にデフォルト インスタンス (名前付きインスタンスではなく) を使用しており、アセンブリによってスキャンしてインスタンスを結び付ける単純な規則を定義することができました。規約自体の詳細には立ち入らずに、次のようにブートストラップします。
assemblies.ForEach(a =>
x.Scan(y =>
{
y.Assembly(a);
y.WithDefaultConventions();
y.Convention<DomainInterfaceNamingConvention>();
}));
は、イニシャライザの他の場所assemblies
にまとめたアセンブリのリストであり、DomainInterfaceNamingConvention
それらのアセンブリをスキャンしてインターフェイスと実装を一致させるためのカスタム規則です。
これは、私が覚えている限り、非常にうまく機能しています。しかし、今では名前付きインスタンスを使用する理由があります。したがって、たとえば、次のようにロガーの実装をブートストラップできます。
x.For<Logger>().Use(l => new Log4Net.LoggerImplementation());
x.For<Logger>().Add(l => new Log4Net.LoggerImplementation()).Named("Log4Net");
x.For<Logger>().Add(l => new NLog.LoggerImplementation()).Named("NLog");
したがって、デフォルトが定義され、コードが特に要求した場合に備えていくつかの名前付きインスタンスが追加されます。
しかし、どうすれば2つを組み合わせることができますか?名前付きインスタンスの例では、構成はクラスごとですが、規則ベースのインスタンスの例では、構成はアセンブリごとです。いくつかのアセンブリに多数のクラスがあり、この特定のシナリオでは、これらのクラスがかなり頻繁に出入りする可能性があります。そのため、各アセンブリだけでなく各クラスを手動で接続する必要があることは、開発にとって取るに足らない運用上の頭痛の種になります。
規則ベースのスキャンでアセンブリ レベルで名前を付ける方法はありますか? したがって、たとえば、あるアセンブリには「Database」という名前の大量のブートストラップ リポジトリ インスタンスがあり、別のアセンブリには「XML」という名前のトン、別のアセンブリには「Mock」という名前のトンのリポジトリ インスタンスがあり、個々のリポジトリを個別に指定する必要はありません。 (3 回、デフォルトを数えると 4 回) ブートストラッパーで?