c# - 使用 Fluent 接口(interface)在 CaSTLe Windsor 中从基础开始注册所有类

标签 c# castle-windsor

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

目前我们正在注册从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>()让他们解决?

我确信这很简单,但如果我能找到它,我就该死了。

提前致谢。

最佳答案

我们遇到了类似的问题,但只需要注册第一个抽象的碱基。我使用 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 };
}

关于c# - 使用 Fluent 接口(interface)在 CaSTLe Windsor 中从基础开始注册所有类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8902919/

相关文章:

c# - 覆盖 CaSTLe Windsor 中的组件注册?哪个容器支持它?

caSTLe-windsor - CaSTLe Windsor 3.0 组件注册 "ServiceType"

c# - 如何将行动态添加到 asp.net 表中?

c# - 如何在自动生成的列之后在 gridview 中插入列 - ASP.NET

c# - 如何在 JavaScript 方法中获取 ASP.NET DataGrid 控件的选定行索引?

caSTLe-windsor - 在 NServiceBus 下管理 Windsor 中的 RavenDb session

c# - 如何将具体类注册到通用接口(interface)?

c# - 如何使用 C# 获取我的全局 IP 地址?

c# - 我应该使用 Invoke 还是 SynchronizationContext 从另一个线程更新表单控件?

c# - CaSTLe Windsor注册接口(interface)