使用Fluent界面在温莎城堡注册所有课程

本文关键字:注册 城堡 Fluent 界面 使用 | 更新日期: 2023-09-27 18:20:40

我有一个抽象的基类Search。 抽象类IndexedRepositorySearchSearch 衍生而来。 抽象类FacetSearchIndexedRepositorySearch . 具体类IngredientFacetSearchRecipeFacetSearchFacetSearch下降。

目前,我们正在将温莎城堡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>()

我确定这是一件简单的事情,但如果我能找到它,我会的。

提前谢谢。

使用Fluent界面在温莎城堡注册所有课程

我们对此有一个简单的问题,但只需要注册第一个抽象的碱基。我使用 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 };
}