使用Fluent界面在Castle Windsor中注册所有课程

时间:2012-01-17 23:03:47

标签: c# castle-windsor

我有一个抽象基类Search。抽象类IndexedRepositorySearch来自Search。抽象类FacetSearch来自IndexedRepositorySearch。具体类IngredientFacetSearchRecipeFacetSearch来自FacetSearch

目前,我们正在使用Castle Windsor注册来自Search的所有内容,如下所示:

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

然后我们打电话

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

它无法解决容器中的任何问题。当我在注册所有内容后在容器上放置断点并在调试器中检查AllComponents时,我会看到IngredientFacetSearchRecipeFacetSearch,但它们每个只有两个与之关联的服务:他们的自我和Search,他们的基础。鉴于他们已在.WithServiceBase().WithServiceSelf()注册,您可以期待。

所以问题是如何通过调用ResolveAll<FacetSearch>()来解决问题?

我确信这很简单,但如果我能找到它,我会很高兴。

提前致谢。

1 个答案:

答案 0 :(得分: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 };
}