背景
我们正在尝试利用 Optimizely CMS 11 的内置类别功能,因此我们可以将类别分配给页面并使用这些类别来过滤来自 Optimizely 搜索和导航的搜索结果。
虽然文档提到使用页面类别来过滤搜索结果,但它确实强调 S&N 并不支持它们开箱即用。 因此,他们提供的功能除了与实际上不支持它的许可附加组件一起使用之外,实际上没有任何用途......好吧。
但是,关于如何实现这一目标,有足够的信息。或者我是这么想的...
问题
我发现一篇文章使用FilterFacet来判断页面是否包含指定的类别。这期望类别是一个 INT(大概是类别文本值的 ID),我们需要找到所选类别字符串对应的 ID。
因此,我们获取选定的类别字符串,并找到 ID,如下所示:
var categoryRepository = ServiceLocator.Current.GetInstance<CategoryRepository>();
var categoryFilter = categoryRepository.Get(typeFilter);
然后
categoryFilter
(类别类型)可以在PageData.InCategory(categoryFilter)
中使用。
但是,根据标题,当使用 Optimizely ServiceLocator 获取 CategoryRepository 的实例时,我得到 null。
缺乏文档,但根据各种文章和论坛帖子,通常
ServiceLocator.Current.GetInstance<CategoryRepository>()
应该没问题,但它返回 null。
有趣的是,CategoryRepository 并不是一个通常被指定为
GetInstance<T>()
类型约束的接口。 CategoryRepository
是抽象的。
除此之外,在我见过的所有地方都使用此作为示例来获取 CMS 管理部分中定义的类别,没有人抱怨它不起作用。
是否有一些明显我遗漏的东西没有在任何地方提到? 我们在这里错过了一个技巧吗? 是否有更简单的方法按指定类别过滤 S&N 结果?
第二天就开始工作了。
不知道为什么。由于我在同一个存储库中处理过其他部分,我只能假设有人没有正确构建。
但是现在它按照预期获得了 CategoryRepository 的实例,所以这个问题现在没有意义了。