我目前正在开发一个网站,允许用户搜索自定义产品目录。我一直在寻找并希望利用 Orchard CMS 来帮助我开发这个网站。我目前已经经历了罗恩·彼得森的 YouTube 系列 http://www.youtube.com/watch?v=Iv7rA-viyTw关于定制 Orchard 模块和天行者博客系列 http://skywalkersoftwaredevelopment.net/blog/writing-an-orchard-webshop-module-from-scratch-part-1.
我觉得我的目标是可能的,但我正在寻找一些验证来验证我的策略是否会在 Orchard 框架内发挥作用。
这是我目前的情况:
我有一个默认的 Orchard 配置,指向 SQL DB(名为
产品-果园)
我有一个指向另一个 SQL DB(名为 Products)的自定义 DAL。
产品由您的典型信息组成(产品名称、
描述、价格等)。
自定义 DAL 有一个名为 Product 的 POCO 模型(带有一个存储库
与属性名称、描述、价格交互。
现在,根据我读到的有关创建 Orchard 模块的信息,创建具有自定义内容的自定义模块的方法似乎是:
通过代码生成工具创建模块(我们将其称为 ProductModule)
创建自定义内容部分 (ProductPart)
创建自定义内容部件记录 (ProductPartRecord) 以充当部件的数据模型。
创建一个自定义 Content PartHandler (Product PartHandler) 来处理 Content Part 的持久性。
创建一个自定义驱动程序,它是准备渲染 UI 的形状的入口。
可能创建一个与驱动程序交互的服务?
这就是事情开始变得混乱的地方,我不确定这是否可能。我想要做的是创建一个由我的自定义 DAL 支持的自定义内容类型,而不是通过 Product-Orchard DB 内的 ContentPartRecord 存储数据,但仍然允许它由 Lucene 模块索引以允许用于搜索产品目录。
是否可以创建由不同数据源支持的自定义 ContentType 和/或 ContentPart,并且仍然利用 Lucene 搜索功能?
在高级术语中,我想要一个 Product ContentType,其中 ContentItems 实际上存储在我的辅助数据库中,而不是 Orchard 数据库中(并且仍然希望能够通过投影利用 Lucene 搜索)。
对于那些寻找类似答案的人,我选择了以下解决方案。我找不到简单的机制来与单独的 DAL 交互并执行 Lucene 索引。
- 创建 Orchard 模块
- 创建新的内容部分/类型签证移民
- 使用 Orchard Command 基础架构从辅助数据库导入数据
- 使用内容部分处理程序中的 OnIndexing 事件允许 Lucene 为您的数据源建立索引。
- 创建一个查找属性(我称之为 ConcreateProperty),该属性通过我在模块中创建的服务进行填充,以与 OnLoaded 事件中的辅助 DAL 进行交互。
我的最终处理程序如下所示:
public class HomePartHandler : ContentHandler {
public HomePartHandler(IRepository<HomePartRecord> repository, IHomeSearchMLSService homeSearchService) {
Filters.Add(StorageFilter.For(repository));
OnLoaded<HomePart>((ctx, part) =>
{
part.ConcreteProperty = homeSearchService.GetByMlsNumber(part.MlsId) ?? new PropertyDetail();
});
OnIndexing<HomePart>((context, homePart) => context.DocumentIndex
.Add("home_StreetFullName", homePart.Record.StreetFullName).RemoveTags().Analyze().Store()
.Add("home_City", homePart.Record.City).RemoveTags().Analyze().Store()
.Add("home_State", homePart.Record.State).RemoveTags().Analyze().Store()
.Add("home_Zip", homePart.Record.Zip).RemoveTags().Analyze().Store()
.Add("home_Subdivision", homePart.Record.Subdivision).RemoveTags().Analyze().Store()
.Add("home_Beds", homePart.Record.Beds).RemoveTags().Analyze().Store()
.Add("home_Baths", homePart.Record.Baths).RemoveTags().Analyze().Store()
.Add("home_SquareFoot", homePart.Record.SquareFoot).RemoveTags().Analyze().Store()
.Add("home_PropertyType", homePart.Record.PropertyType).RemoveTags().Analyze().Store()
.Add("home_ListPrice", homePart.Record.ListPrice).RemoveTags().Analyze().Store()
.Add("home_MlsId", homePart.Record.MlsId).RemoveTags().Analyze().Store()
.Add("home_Latitude", (double)homePart.Record.Latitude).RemoveTags().Analyze().Store()
.Add("home_Longitude", (double)homePart.Record.Longitude).RemoveTags().Analyze().Store()
);
}
}
这使我能够创建一个搜索服务来搜索所有数据,然后通过具体属性将其连接到模型,无论如何从性能的角度来看,这实际上效果更好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)