我有一个抽象基类Search
。抽象类IndexedRepositorySearch
源自 Search
。抽象类FacetSearch
源自 IndexedRepositorySearch
。具体类IngredientFacetSearch
和RecipeFacetSearch
源自FacetSearch
.
目前我们正在注册从Search
开始的所有内容。温莎城堡如下:
AllTypes.FromAssembly(assembly)
.BasedOn<Search.Search>()
.WithServiceBase()
.WithServiceSelf()
.LifestyleTransient()
.AllowMultipleMatches()
当我们调用时
_container.ResolveAll<FacetSearch>(new { searchInput = input, searchResults });
它不会解析容器中的任何内容。当我在注册所有内容后在容器上放置断点并检查 AllComponents
在调试器中,我看到 IngredientFacetSearch
和RecipeFacetSearch
,但他们每个人都只有两个与之关联的服务:他们自己和 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/