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};
}