0

正如我在这里所揭示的,我希望能够在没有 Orchard 为我构建查询的情况下自由地查询索引。

我构建了一个模块,并插入了 SearchController 的副本,添加了一条新路由……为了覆盖有关查询的默认 Orchard 行为,我必须创建以下新实现:ISearchService、IIndexManager、ISearchBuilder、IIndexProvider。它们的默认实现有一些小的修改,但它们是必需的。

这按预期工作,但它目前也覆盖了默认搜索。这是因为我使用了相同的接口,而 autofac 采用了我的实现。

我希望能够保持默认实现不变(在 url /Search 处),并在 url 处添加我的实现(例如 /LuceneSearch)

我想我必须通过创建一个继承 autofac Module 类的类来告诉 Autofac 仅将我的实现用于我的控制器。这是我的问题:我不知道如何告诉 Autofac 默认使用 Orchard 实现,而仅对于我的控制器,使用我的实现....

另一种可能性是创建新界面,但在我看来并不是很漂亮......

有人能帮我吗 ?:)

4

3 回答 3

1

元数据功能将在这里为您提供帮助。此外,您必须使用PreserveExistingDefaults()修饰符注册您的实现,以默认保留果园的实现。

更新:

Orchard 注册了来自 Autofac 的 IModule 实现和 Orchard 的 IDependency 的所有依赖项。所有的魔法都发生在 Orchard 的 ShellContainerFactory 类中。由于 ISearchService 继承自 IDependency 您的实现由 Orchard 注册,它会覆盖默认值。
你有两种方法:

  1. 引入你自己的空接口 IMySearchService,它继承自 ISearchService。在您需要实现的代码中实现和使用它。Orchard 将为您处理所有注册。
  2. Orchard 使用 ShellContainerFactory.RegisterType 方法中的“功能”元数据注册所有 IDependency 实现。您可以在代码中阅读此元数据并选择您的实现(请参阅上面的 wiki 链接)。要素类包含有关您的模块的所有必要信息。

希望这会帮助你。

于 2013-11-04T07:26:03.460 回答
1

一种不涉及 Autofac 复杂性的更简单方法是IEnumerable<IInterface>在控制器/驱动程序中使用 url "/LuceneSearch" 的变量来保存所有实现IInterface并选择使用哪个。

例如,为了使用您的实现IIndexManager,您可以将以下内容放入您的控制器或驱动程序中

public class MyCustomPartDriver : ContentPartDriver<MyCustomPart> {
    private readonly IEnumerable<IIndexManager> _indexManagers;

    public MyCustomPartDriver(IEnumerable<IIndexManager> indexManagers) {
        _indexManagers = indexManager;
    }

    protected override DriverResult Display(MyCustomPart part, string displayType, dynamic shapeHelper) {
        //Use your implementation of IIndexManager
        var indexManager = _indexManagers.First(im => im is MyCustomIndexManager);

        //Get the ISearchBuilder from your implementation of IIndexManager
        var searchBuilder = indexManager.HasIndexProvider() ? indexManager.GetSearchIndexProvider().CreateSearchBuilder("Search") : new NullSearchBuilder();

        //perform search on the indexing engine
        var contentItemIds = searchBuilder.
            .WithField("type", "MyCustomType").Mandatory().ExactMatch()
            .Parse("mycustompart-keyword", part.Keyword).Mandatory()
            .Search()
            .Select(h => h.ContentItemId)
            .ToList();

        //do stuff with the results returned and return a DriverResult using the ContentShape method. Well, you know the drill.
    }
}
于 2014-02-14T20:13:54.753 回答
0

如果您不想让 autofac 默认解析您自己的实现,则不要实现公共接口。

于 2013-11-04T22:19:46.567 回答