2012-01-17 4 views
2

私は抽象基本クラスSearchを持っています。抽象クラスIndexedRepositorySearchSearchに由来します。抽象クラスFacetSearchIndexedRepositorySearchに由来します。具体的なクラスIngredientFacetSearchおよびRecipeFacetSearchは、FacetSearchの子孫です。我々はそれがコンテナからは何も解決しませんFluentインタフェースを使用してCastle Windsorのベースからすべてのクラスを登録

_container.ResolveAll<FacetSearch>(new { searchInput = input, searchResults }); 

を呼び出すと

AllTypes.FromAssembly(assembly) 
     .BasedOn<Search.Search>() 
     .WithServiceBase() 
     .WithServiceSelf() 
     .LifestyleTransient() 
     .AllowMultipleMatches() 

現在、我々は次のように城ウィンザーでSearchから下降し、すべてを登録しています。すべてが登録され、デバッガでAllComponentsをチェックした後にコンテナにブレークポイントを置くと、IngredientFacetSearchRecipeFacetSearchの両方が表示されますが、それぞれに2つのサービスが関連付けられています:自己とSearch、ベース。 .WithServiceBase().WithServiceSelf()で登録されているとすれば、どれが期待できますか?

したがって、ResolveAll<FacetSearch>()を呼び出すことで問題を解決する方法は?

私はそれが何かシンプルだと確信していますが、私がそれを見つけることができれば私は気が狂っています。

ありがとうございます。

答えて

3

私たちはこれに匹敵する問題を抱えていましたが、抽象的な最初の基盤を登録するだけでした。私はWithServiceSelectを使用してそれを解決そのように使用される拡張メソッドにそれを包ん:

AllTypes.FromAssembly(assembly) 
     .BasedOn<Search.Search>() 
     .WithServiceLastAbstractBase(), 

拡張メソッドの定義である:

public static BasedOnDescriptor WithServiceLastAbstractBase(this BasedOnDescriptor basedOn) 
{ 
    return basedOn.WithServiceSelect(selectLastAbstractBase); 
} 

private static IEnumerable<Type> selectLastAbstractBase(Type type, Type[] basetypes) 
{ 
    var baseType = type; 

    do 
    { 
     baseType = baseType.BaseType; 
    } while (baseType != null && !baseType.IsAbstract); 

    if (baseType == null) 
    { 
     throw new ArgumentException("There are no abstract base types for: " + type); 
    } 

    return new [] { baseType }; 
} 
関連する問題