Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Fluent接口在Castle Windsor中注册base on up中的所有类_C#_Castle Windsor - Fatal编程技术网

C# 使用Fluent接口在Castle Windsor中注册base on up中的所有类

C# 使用Fluent接口在Castle Windsor中注册base on up中的所有类,c#,castle-windsor,C#,Castle Windsor,我有一个抽象基类Search。抽象类indexedepositorysearch从Search派生而来。抽象类FacetSearch从indexedepositorysearch派生而来。具体类InCreditFaceSearch和RecipeFaceSearch从FaceSearch派生而来 目前,我们正在向Castle Windsor注册从Search下载的所有内容,如下所示: AllTypes.FromAssembly(assembly) .BasedOn<Searc

我有一个抽象基类
Search
。抽象类
indexedepositorysearch
Search
派生而来。抽象类
FacetSearch
indexedepositorysearch
派生而来。具体类
InCreditFaceSearch
RecipeFaceSearch
FaceSearch
派生而来

目前,我们正在向Castle Windsor注册从
Search
下载的所有内容,如下所示:

AllTypes.FromAssembly(assembly)
        .BasedOn<Search.Search>()
        .WithServiceBase()
        .WithServiceSelf()
        .LifestyleTransient()
        .AllowMultipleMatches()
AllTypes.fromsassembly(assembly)
.BasedOn()
.WithServiceBase()
.WithServiceSelf()
.生活方式
.AllowMultipleMatches()
当我们打电话的时候

_container.ResolveAll<FacetSearch>(new { searchInput = input, searchResults });
\u container.ResolveAll(新的{searchInput=input,searchResults});
它不会解析容器中的任何内容。在所有内容都已注册并在调试器中检查
AllComponents
后,当我在容器上放置断点时,我会看到
InCreditFaceSearch
RecipeFaceSearch
,但它们都只有两个相关联的服务:它们的self和
Search
,它们的基础。如果他们注册了
.WithServiceBase()
.WithServiceSelf()
,您可能会想到这一点

因此,问题是如何通过调用
ResolveAll()
来解决这些问题

我相信这很简单,但如果我能找到的话,我会倒霉的


提前感谢。

我们对此也有类似的问题,但只需要注册第一个抽象的碱基。我使用
和serviceselect解决了这个问题,但将它包装成一个扩展方法,以便使用:

AllTypes.FromAssembly(assembly)
        .BasedOn<Search.Search>()
        .WithServiceLastAbstractBase(),
AllTypes.fromsassembly(assembly)
.BasedOn()
.WithServiceAsTabstractBase(),
扩展方法的定义为:

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 };
}
publicstaticbasedondescriptor和servicelastabstractbase(此BasedOnDescriptor basedOn)
{
返回basedOn.WithServiceSelect(选择LastAbstractBase);
}
私有静态IEnumerable selectLastAbstractBase(类型类型,类型[]basetypes)
{
var baseType=type;
做
{
baseType=baseType.baseType;
}while(baseType!=null&&!baseType.isastract);
if(baseType==null)
{
抛出新ArgumentException(“没有:“+type”的抽象基类型);
}
返回新的[]{baseType};
}