使用Fluent界面在温莎城堡注册所有课程
本文关键字:注册 城堡 Fluent 界面 使用 | 更新日期: 2023-09-27 18:20:40
我有一个抽象的基类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 };
}