在mojoprotal 中定义了IIndexableContent接口,这个接口只包好一个自定义的事件ContentChangedEventHandler。 HtmlContent,CalendarEvent,Blog,SharedFile,Link,GalleryImage,ForumThread类 都实现了该接口,作用是用来索引内容,方便搜索。
下面以对blog内容的删除为例,解释其中的事件和委托是如何工作的。在mojoPortal.Business中定义ContentChangedEventHandler委托和自定义事件参数。
public delegate void ContentChangedEventHandler(object sender, ContentChangedEventArgs e);
public class ContentChangedEventArgs : EventArgs
{
private bool isDeleted = false;
public bool IsDeleted
{
get { return this.isDeleted; }
set { isDeleted = value; }
}
}
public class ContentChangedEventArgs : EventArgs
{
private bool isDeleted = false;
public bool IsDeleted
{
get { return this.isDeleted; }
set { isDeleted = value; }
}
}
定义IIndexableContent接口
public interface IIndexableContent
{
event ContentChangedEventHandler ContentChanged;
}
{
event ContentChangedEventHandler ContentChanged;
}
在BlogEdit.aspx.cs页面中,当点击删除指定blog文章时,按钮处理函数是
private void btnDelete_Click(object sender, EventArgs e)
{
if(ItemID > -1)
{
Blog blog = new Blog(ItemID);//得到选定的blog对象
blog.ContentChanged += new ContentChangedEventHandler(BlogIndexBuilder.Blog_ContentChanged);//将BlogIndexBuilder.Blog_ContentChanged事件处理函数绑定到blog中的ContentChanged事件中
blog.Delete();
}
return;
}
{
if(ItemID > -1)
{
Blog blog = new Blog(ItemID);//得到选定的blog对象
blog.ContentChanged += new ContentChangedEventHandler(BlogIndexBuilder.Blog_ContentChanged);//将BlogIndexBuilder.Blog_ContentChanged事件处理函数绑定到blog中的ContentChanged事件中
blog.Delete();
}
return;
}
在BlogIndexBuilder.cs中定义Blog_ContentChanged事件处理函数
public static void Blog_ContentChanged(object sender, ContentChangedEventArgs e)
{
Blog blog = (Blog)sender;
if (e.IsDeleted)
{
IndexHelper.RemoveIndexItem(blog.ModuleID, blog.ItemID);
}
else
{
IndexItem(blog);
}
}
{
Blog blog = (Blog)sender;
if (e.IsDeleted)
{
IndexHelper.RemoveIndexItem(blog.ModuleID, blog.ItemID);
}
else
{
IndexItem(blog);
}
}
blog.cs文件
blog类实现IIndexableContent接口
public event ContentChangedEventHandler ContentChanged;
protected void OnContentChanged(ContentChangedEventArgs e)
{
if (ContentChanged != null)//如果ContentChanged被绑定事件
{
ContentChanged(this, e);//执行被绑定到ContentChanged的事件处理方法
}
} public bool Delete()
{
bool result = dbPortal.Blog_DeleteBlog(this.itemID);//调用数据访问层方法在数据库中删除数据
if (result)
{
result = dbPortal.Blog_DeleteItemCategories(itemID);
ContentChangedEventArgs e = new ContentChangedEventArgs();
e.IsDeleted = true;//设置 自定义事件参数中的IsDeleted字段为true,标记对象已经被删除
OnContentChanged(e);//处理ContentChanged事件
}
return result;
}
protected void OnContentChanged(ContentChangedEventArgs e)
{
if (ContentChanged != null)//如果ContentChanged被绑定事件
{
ContentChanged(this, e);//执行被绑定到ContentChanged的事件处理方法
}
} public bool Delete()
{
bool result = dbPortal.Blog_DeleteBlog(this.itemID);//调用数据访问层方法在数据库中删除数据
if (result)
{
result = dbPortal.Blog_DeleteItemCategories(itemID);
ContentChangedEventArgs e = new ContentChangedEventArgs();
e.IsDeleted = true;//设置 自定义事件参数中的IsDeleted字段为true,标记对象已经被删除
OnContentChanged(e);//处理ContentChanged事件
}
return result;
}
使用事件和委托的好处是各个需要索引的实体能方便调用各自的索引方法,能使索引中的内容和实际内容同步。避免在一个类中直接调用另外一个类中的函数,降低了模块间的耦合性。Created by jecray