1

私はしばらくの間 S​​tructureMap を使用してきましたが、専門家にはほど遠いものです。私の問題は単純です。コード (レジストリ) を介して 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」が含まれていることも確認しました。
4

1 に答える 1

0

私は解決策を見つけましたが、「魔法」には悪臭があります:

ForRequestedType<Repository.IBusinessUnitRepository>()
            .CacheBy( InstanceScope.PerRequest )
            .TheDefault.Is.OfConcreteType<BusinessUnitRepository>()
            .CtorDependency<IDatabaseFactory>("factory").IsTheDefault();

SelectConstructor<BusinessUnitRepository>( () => new BusinessUnitRepository((IDatabaseFactory)null ) );

私はまだより良い答えがあると思います。SelectConstructor私はかなりの数の Repository インターフェースと具体的な実装を持っているので、各タイプを定義するのは大変な作業のようです。私は提案を受け入れます。

于 2009-07-13T01:15:53.210 に答える