私はしばらくの間 StructureMap を使用してきましたが、専門家にはほど遠いものです。私の問題は単純です。コード (レジストリ) を介して SM を構成し、リポジトリ オブジェクトのインスタンスを作成するときに特定のコンストラクターを使用しようとしています。
これが私の2つのコンストラクターです(どちらも貪欲ではないことに注意してください)。
public BusinessUnitRepository( IDatabase database )
: base( database ) {
}
public BusinessUnitRepository( IDatabaseFactory factory )
: base( factory ) {
}
注: 最初のコンストラクターはIDatabase
インターフェイスのインスタンスを受け取り、基本クラスの ctor(IDatabaseFactory) 実装によって呼び出されます。
私がやろうとしているのは、2 番目のコンストラクターを使用しDatabaseFactory
て SM コンテナーからのインスタンスを提供するように SM を構成することです。[DefaultConstructor]
が定義されているアセンブリで属性を使用できないため、BusinessUnitRepository
このオプションはテーブルから外れています。
私の登録コード
ForRequestedType<IDatabaseFactory>()
.CacheBy( InstanceScope.PerRequest )
.TheDefaultIsConcreteType<DatabaseFactory>();
ForRequestedType<Repository.IBusinessUnitRepository>()
.CacheBy( InstanceScope.PerRequest )
.TheDefault.Is.OfConcreteType<BusinessUnitRepository>().CtorDependency<IDatabaseFactory>().Is<DatabaseFactory>();
プログラム SM を実行すると、 のインスタンスを作成しようとすると 302 エラーがスローされますBusinessUnitRepository
。
StructureMap.StructureMapException: StructureMap Exception Code: 302
There is no argument of type Repository.LinqToSql.IDatabaseFactory for concrete type Repository.LinqToSql.BusinessUnitRepository
ご参考までに:
- Repository.LinqToSql.BusinessUnitRepository アセンブリで StructureMap を参照し、IDatabaseFactory コンストラクターで [DefaultConstructor] 属性を使用すると、すべてが完全に機能します。
- また、StructureMap に構成済みの「Repository.LinqToSql.DatabaseFactory」が含まれていることも確認しました。