2011-10-26 9 views
1

城ウィンザーで一般的な抽象クラスを登録、私はこの例では私の場合を簡素化しましたGenericBaseClass<EntityA>をリクエストするとConcreteAを返します。私は慣例によってタイプを登録しようとしています

タイプ GenericBaseClass`1のインスタンスを取得しようとしているときに、私はの定義を変更した場合

ライセンス認証エラーは、キー「」

を発生しました:これを解決しようとすると、私のような何かを言って例外を取得します抽象クラスからインターフェイスへGenericBaseClass<T>、この登録コードは動作します:

container.Register(AllTypes.FromAssemblyContaining<BaseClass>() 
     .BasedOn(typeof(GenericBaseClass<>)) 
     .WithService.FirstInterface()); 

はしかし、私はそれの内のコードを記述する必要があるため、抽象クラスを使用する必要があります。 ConcreteXクラスごとに手動で登録することはできますが、あまり役に立ちません。

私はこれを試してみた:

container.Register(AllTypes.FromAssemblyContaining<BaseClass>() 
     .BasedOn(typeof(GenericBaseClass<>)) 
     .WithService.Base()); 

デバッグは、私はタイプがコンテナに追加されていない見ることができます。

私はCastle Windsor 2.6を使用しています。

ありがとうございました。

+0

ウィンザー2.6はありません。あなたは2.5.4を意味しましたか? –

答えて

0

これは動作します:あなたがコンテナに追加されていないタイプが表示された場合

container.Register(AllTypes.FromAssemblyContaining<ConcreteA>() 
        .BasedOn(typeof (GenericBaseClass<>)) 
        .WithService.Base()); 

あなたが右の組み立て(実装タイプではなく、サービスの種類が含まれているもの)をスキャンしていることを確認してください。

+1

提案どおりに動作させることができませんでした。これは働いていたが、私はどのConcreteXタイプのために同じコードを追加する必要がありました:container.Register( Component.For(typeof演算(GenericBaseClass )) .ImplementedBy(typeof演算(ConcreteA)) .Named( "ConcreteA") を); – Hero

+0

なぜですか?それはまさに私のコードが行っていることです(名前部分を除いて) –

+0

@Hero、あなたのソリューションは私のために働いた、私は抽象基本クラスと2つの実装があります。私はすでに同じコードを持っていましたが、同じサービスを使用して両方のコンポーネント登録を区別するために.Named( "...")部分が欠けていました。ありがとう! – kzfabi

関連する問題