转自 http://www.cnblogs.com/Athos/archive/2007/03/09/669424.html

提纲挈领地,要使DNN的自定义模块加入搜索引擎,有如下3个要点:

1、自定义模块的Controller类要实现ISearchable接口。这个是肯定的。

2、模块定义时一定要填写Controller Class属性。因为搜索引擎的调度执行的时候,会利用反射创建Controller Class,寻找实现ISearchable接口的GetSearchItem方法。

3、DNN_DesktopModules表的SupportedFeatures字段,要填3。
--------------------------------------------------------------------------------------------------------

1、先看如何实现ISearchable接口。

在先前的DNN搜索引擎研究中提到:在DNN的架构中,提供了一个ISearchable的接口,只要实现这个接口的模块,都可以作为搜索的数据源。同样的,你如果想让自己写的模块被搜索引擎收录的话,你就要实现ISearchable接口。

我们来看一下ISearchable接口的内容,该接口位于DotNetNuke/Components/Modules(在解决方案中的路径)下面。

 'DotNetNuke?- http://www.dotnetnuke.com
 ' Copyright (c) 2002-2005
 ' by Perpetual Motion Interactive Systems Inc. ( http://www.perpetualmotion.ca )
 '
 ' Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated 
 ' documentation files (the "Software"), to deal in the Software without restriction, including without limitation 
 ' the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and 
 ' to permit persons to whom the Software is furnished to do so, subject to the following conditions:
'
' The above copyright notice and this permission notice shall be included in all copies or substantial portions 
' of the Software.
'
' THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED 
' TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
' THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF 
' CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
' DEALINGS IN THE SOFTWARE.
'

Imports DotNetNuke.Services.Search

Namespace DotNetNukeNamespace DotNetNuke.Entities.Modules
    Public Interface ISearchableInterface ISearchable
        Function GetSearchItems()Function GetSearchItems(ByVal ModInfo As ModuleInfo) As SearchItemInfoCollection
    End Interface
End Namespace

很简单,该接口只有一个方法声明,GetSearchItems,在搜索引擎执行的时候,DNN会根据此方法获取能够被搜索的模块项目。那么,如何实现该接口呢?我们首先看一下DNN自带的模块是怎么做的,比如Links模块。

''' -----------------------------------------------------------------------------
        ''' <summary>
        ''' GetSearchItems implements the ISearchable Interface
       ''' </summary>
        ''' <remarks>
        ''' </remarks>
        ''' <param name="ModInfo">The ModuleInfo for the module to be Indexed</param>
        ''' <history>
        '''        [cnurse]    11/17/2004    documented
        ''' </history>
        ''' -----------------------------------------------------------------------------
        Public Function GetSearchItems()Function GetSearchItems(ByVal ModInfo As Entities.Modules.ModuleInfo) As Services.Search.SearchItemInfoCollection Implements Entities.Modules.ISearchable.GetSearchItems
            Dim SearchItemCollection As New SearchItemInfoCollection

Dim Links As ArrayList = GetLinks(ModInfo.ModuleID)

Dim objLink As Object
            For Each objLink In Links
                Dim SearchItem As SearchItemInfo
                With CType(objLink, LinkInfo)
                    ' 
                    Dim UserId As Integer = Null.NullInteger
                    If IsNumeric(.CreatedByUser) Then
                        UserId = Integer.Parse(.CreatedByUser)
                    End If
                    SearchItem = New SearchItemInfo(ModInfo.ModuleTitle & " - " & .Title, .Description, UserId, .CreatedDate, ModInfo.ModuleID, .ItemId.ToString, .Description, "ItemId=" & .ItemId.ToString, Null.NullInteger)
                    SearchItemCollection.Add(SearchItem)
                End With
            Next

Return SearchItemCollection
        End Function

参照这些代码,我们可以书写自己的GetSearchItems方法了。注意,这个接口的实现是写在模块的Controller类中的。假如你要写一个新闻模块,那么GetSearchItems方法可以书写如下:

        public DotNetNuke.Services.Search.SearchItemInfoCollection GetSearchItems(DotNetNuke.Entities.Modules.ModuleInfo ModInfo)
        {
            DotNetNuke.Services.Search.SearchItemInfoCollection searchItems = new DotNetNuke.Services.Search.SearchItemInfoCollection();
            ArrayList News = List(ModInfo.ModuleID);
            foreach(NewsInfo news in News)
            {
                DotNetNuke.Services.Search.SearchItemInfo item;
                item = new DotNetNuke.Services.Search.SearchItemInfo(ModInfo.ModuleTitle + "-" + news.Title,news.Content,Null.NullInteger,news.CreateDate,ModInfo.ModuleID,news.ItemID.ToString(),news.Content,Null.NullInteger);
                searchItems.Add(item);
            }
            return searchItems;
        }

2、在模块管理中进行模块定义时,一定要填写Controller Class属性。

原因是在搜索引擎运行时,会读取模块的此属性,然后使用反射创建Controller Class,检查它是否实现了ISearchable接口。(具体代码在Provider.Search.Index项目的ModuleIndexer类的GetModuleList方法中。)事实上,如果不填写Controller Class,模块也能正常使用,其他地方没有任何异常,所以我就习惯了不填它,结果费了很大劲才搞明白原来是这儿的原因。

3、DNN_DesktopModules表的SupportedFeatures字段,要填3。

这个就更诡异了。SupportedFeatures这个字段是什么意思呢?风云在DNN配置-数据库篇中有所解释,该字段表示模块支持的特性。DNN中有个DesktopModuleInfo类,对该属性有所描述:

    Public Enum DesktopModuleSupportedFeatureEnum DesktopModuleSupportedFeature
        IsPortable = 1
        IsSearchable = 2
    End Enum

ModuleInfo类中也有该属性,并且初始值为0。但在模块管理的Add、Update事件中,根本找不到是在哪儿对该属性赋值的,也就是说,你自定义的模块插入到数据库中,该字段的值肯定是0。
    但是,DNN使用GetSearchModules存储过程获取能够搜索的模块,其中有个where条件是:(DesktopModules.SupportedFeatures & 2 = 2)。因此无论如何你的自定义模块是不会满足这个条件的。去看看Links、Text/Html这些DNN自带的能够搜索的模块,发现这个字段是3。那么3代表什么呢?不知道。把自己的模块也改成3,果然就行了。不知道这个是DNN留出的一个扩充接口呢,还是一个Bug。
    (我使用的DNN版本是3.2.2。)

转载于:https://www.cnblogs.com/Elong/archive/2007/03/10/670450.html

如何使自定义模块加入DNN搜索引擎(转)相关推荐

  1. qt自定义插件creator不显示_让Qt Creator更懂我们的自定义模块

    用QML模块的方式组织软件是个不错的结构设计,笔者的QtQuick项目都会首先考虑QML模块的划分,然后以搭积木的方式完成最后的开发. Qt Creator是开发QtQuick程序的首先IDE,因为它 ...

  2. python中time库引用不正确的_python模块知识一 自定义模块、time、datetime时间模块...

    第五章 模块 1.自定义模块: 模块分类: 内置模块(标准库)-- python解释器自带的.py文件(模块) 第三方模块(各种大神写的)-- 需要额外下载(并发编程pypi) 自定义模块(自己写的) ...

  3. jboss eap_带有自定义模块的JBoss EAP上的骆驼

    jboss eap Apache Camel -最好的开源集成库 Apache Camel是一个很棒的开放源代码集成库,可以用作ESB的主干或在独立的应用程序中进行系统的路由,转换或中介(请参阅:集成 ...

  4. 带有自定义模块的JBoss EAP上的骆驼

    Apache Camel -最好的开源集成库 Apache Camel是一个很棒的开放源代码集成库,可以用作ESB的主干或在独立的应用程序中进行系统的路由,转换或中介(请参阅:集成多个系统). Cam ...

  5. python设计自定义栈类_Python如何自定义模块?Python基础教程,第十讲,自定义模块...

    学完此次课程,我能做什么? 通过此次课程,我们将学会如何自定义自己的模块和包,以及如何引用到自己的项目中,从而实现代码的复用. 学习此次课程,需要多久? 5-10分钟 课程内容 什么是Python的标 ...

  6. python导入同一文件夹下的类_python自定义模块

    模块的引入方式: 1.import 模块名:导入模块中的所有内容(引入多个用逗号分隔) import random,time 2.from 模块名 import 函数名1,函数名2... 导入部分模块 ...

  7. (15)Node.js 自定义模块

    一.自定义模块介绍 程序员自己写的 Node.js 模块. • Node.js 中每个单独的 .js 文件,就是一个模块 • 每个模块中都有一个 module 变量,其代表当前模块 • module ...

  8. python导入自定义模块_ubuntu下Python导入自定义模块的方法

    ubuntu下Python导入自定义模块的方法 当在python程序中导入自定义模块时,若出现"Import Error:no module named xxx"表明系统在pyth ...

  9. python-Day5-深入正则表达式--冒泡排序-时间复杂度 --常用模块学习:自定义模块--random模块:随机验证码--time datetime模块...

    正则表达式 语法: mport re #导入模块名 p= re.compile("^[0-9]") #生成要匹配的正则对象 , ^代表从开头匹配,[0-9]代表匹配0至9的任意一个 ...

最新文章

  1. 20120520 Linux下mysql的自动备份工具
  2. 新JSON绑定库JSON-B发布公开预览版
  3. JavaScript实现数乘以二multiplyByTwo算法(附完整源码)
  4. JDK/Java 17 可能带来什么新特性?
  5. SilverlightComponent for ExtJS
  6. 关于某题左列定宽右列宽度自适应布局的学习
  7. 5、使用Libgdx设计一个简单的游戏------雨滴
  8. STM8停产,新唐的N76E003 pin对pin替换STM8S003F3P6
  9. 阿德勒心理学(自我剖析)
  10. java开发app_使用java制作app教程
  11. OPPO员工年薪税后110万,租七百块农民房,被女友数落:太抠了!
  12. Mock数据Mustache语法学习记录
  13. 电力 Web SCADA 工控组态编辑器
  14. C语言startup()函数,WSAStartup()函数以及DLL的加载
  15. 空前绝后!PostgresConf.CNPGConf.Asia 2020大会闭幕
  16. 架构师的 36 项修炼1 开篇词:7分钟Get技术人进阶技巧
  17. 解决联想e470c 无线网卡驱动
  18. win 8 安装
  19. 浅谈语音信号处理系列之二 语音信号处理的基础
  20. loo-cv验证matlab,高光谱成像系统的基本原理,高光谱成像技术在红肉食用品质中的应用进展...

热门文章

  1. 三种批量插入数据的方法
  2. 估值指标二把手——市净率
  3. (信贷风控八)行为评分卡模型(B卡)的介绍
  4. 8.2计算各商品销售金额
  5. 适合编程初学者的开源博客系统
  6. vue- Vue-Cli脚手架工具安装 -创建项目-页面开发流程-组件生命周期-03
  7. 【详细七层】OSI 网络模型,七层网络模型
  8. 影像组学|特征定义以及提取
  9. Apache 基金会创始成员访谈录 ———— 回顾 Apache 20年历程!
  10. 多CPU ,多核和进程以及多线程之间的关系