如何在Cuyahoga中添加公告模块
国外的开源CMS一般都是基于模块设计的 ,好处是可以随意定制自己的页面和模块,这样在以后的应用中就能够灵活的满足变化的功能需求. 一个模块齐全的CMS如DNN , Rainbow就可以快速搭建符合需求的系统.下面就来介绍如何为Cuyahoga这个著名的开源网站框架加入具有后台管理的公告模块.可以参考这篇 如何在Cuyahoga中新增一个简单的功能模块了解基础的步骤.
为Cuyahoga开发自定义模块时,你可以选择任何数据访问策略.然而Cuyahoga本身是使用NHibernate作为数据持久层,可以做到支持多 数据库. 采用Castle.Windsor进行依赖注入,降低模块之间的耦合. 我们的数据访问层也将用NHibernate实现.
最终项目的目录结构如下:
主要步骤如下
1 .创建一个Sql文件(Install.sql)用来安装数据表及添加模块的相关信息 , 该sql文件会在安装模块时,由Cuyahoga自动执行.也可以手工执行进行安装.
IF NOT EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'[cm_Announcements]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
BEGIN
CREATE TABLE [cm_Announcements] (
[AnnouncementsID] [int] IDENTITY (1,1)NOT NULL ,
[sectionid] [int] NOT NULL ,
[createdby] [nvarchar] (100) NULL ,//公告作者
[Title] [nvarchar] (150) NULL ,//公告标题
inserttimestamp datetime DEFAULT current_timestamp NOT NULL,
updatetimestamp datetime DEFAULT current_timestamp NOT NULL,
CONSTRAINT [PK_cm_Announcements] PRIMARY KEY NONCLUSTERED
(
[AnnouncementsID]
),
CONSTRAINT [FK_cm_Announcements_cm_Modules] FOREIGN KEY
(sectionid) REFERENCES cuyahoga_section (sectionid)
)
END
GO
/*加入模块信息*/
INSERT INTO cuyahoga_moduletype ([name], assemblyname, classname, path, editpath, inserttimestamp, updatetimestamp) VALUES
('Announcements', 'Cuyahoga.Modules.Announcements', 'Cuyahoga.Modules.Announcements.AnnouncementsModule',
'Modules/Announcements/Announcements.ascx', 'Modules/Announcements/EditAnnouncements.aspx', current_timestamp, current_timestamp)
GO
/*加入模块版本信息*/
INSERT INTO cuyahoga_version (assembly, major, minor, patch) VALUES ('Cuyahoga.Modules.Announcements', 1, 5, 0);
go
2.创建域模型 在本例中是实体类
using System;
using Cuyahoga.Core.Domain;
namespace Cuyahoga.Modules.Announcements.Domain
{
public class Announcement
{
private int _id;
private string _title;
private string _content;
private DateTime _expiredate;
private Section _section;
private User _createdBy;
private DateTime _updateTimestamp;
/// <summary>
/// Property Id (int)
/// </summary>
public int Id
{
get { return this._id; }
set { this._id = value; }
}
/// <summary>
/// Property Title (string)
/// </summary>
public string Title
{
get { return this._title; }
set { this._title = value; }
}
/// <summary>
/// Property Section (Section)
/// </summary>
public Section Section
{
get { return this._section; }
set { this._section = value; }
}
/// <summary>
/// Property CreatedBy (User)
/// </summary>
public User CreatedBy
{
get { return this._createdBy; }
set { this._createdBy = value; }
}
/// <summary>
/// Property UpdateTimestamp (DateTime)
/// </summary>
public DateTime UpdateTimestamp
{
get { return this._updateTimestamp; }
set { this._updateTimestamp = value; }
}
public Announcement()
{
this._id = -1;
}
}
}
3.创建映射文件
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
<class name="Cuyahoga.Modules.Announcements.Domain.Announcement, Cuyahoga.Modules.Announcements" table="cm_Announcements">
<id name="Id" column="Announcementsid" type="Int32" unsaved-value="-1">
<generator class="native">
<param name="sequence">cm_Announcements_Announcementsid_seq</param>
</generator>
</id>
<timestamp name="UpdateTimestamp" column="updatetimestamp" />
<property name="Title" column="title" type="String" length="150" />
<many-to-one name="Section" class="Cuyahoga.Core.Domain.Section, Cuyahoga.Core" column="sectionid" not-null="true" />
<many-to-one name="CreatedBy" class="Cuyahoga.Core.Domain.User, Cuyahoga.Core" column="createdby" not-null="true" />
</class>
</hibernate-mapping>
4.创建公告模块的核心控制类
using System;
using System.Collections;
using System.Xml;
using System.Xml.XPath;
using System.Net;
using System.Web;
using System.Text;
using System.IO;
using System.Threading;
using NHibernate;
using Castle.Services.Transaction;
using Castle.Facilities.NHibernateIntegration;
using log4net;
using Cuyahoga.Core;
using Cuyahoga.Core.Domain;
using Cuyahoga.Core.Service;
using Cuyahoga.Core.Util;
using Cuyahoga.Web.Util;
using Cuyahoga.Web.Components;
using Cuyahoga.Modules.Announcements.Domain;
namespace Cuyahoga.Modules.Announcements
{
//采用Facilities管理事务
[Transactional]
public class AnnouncementsModule : ModuleBase, INHibernateModule
{
private static readonly ILog log = LogManager.GetLogger(typeof(AnnouncementsModule));
private int _cacheDuration;
private ISessionManager _sessionManager;
//该模块需要用到NHibernate session manager提供的服务 进行依赖注入
public AnnouncementsModule(ISessionManager sessionManager)
{
this._sessionManager = sessionManager;
}
public override void ReadSectionSettings()
{
base.ReadSectionSettings();
// Set dynamic module settings
this._cacheDuration = Convert.ToInt32(base.Section.Settings["CACHE_DURATION"]);
}
///不创建子事务
[Transaction(TransactionMode.RequiresNew)]
public virtual IList GetAllAnnouncements()
{
ISession session = this._sessionManager.OpenSession();
string hql = "from Announcement f where f.Section.Id = :sectionId";
IQuery q = session.CreateQuery(hql);
q.SetInt32("sectionId", base.Section.Id);
return q.List();
}
[Transaction(TransactionMode.RequiresNew)]
public virtual Announcement GetAnnouncementsById(int AnnouncementsID)
{
ISession session = this._sessionManager.OpenSession();
return (Announcement)session.Load(typeof(Announcement), AnnouncementsID);
}
[Transaction(TransactionMode.RequiresNew)]
public virtual void SaveAnnouncement(Announcement announcements)
{
ISession session = this._sessionManager.OpenSession();
session.SaveOrUpdate(announcements);
}
[Transaction(TransactionMode.RequiresNew)]
public virtual void DeleteAnnouncements(Announcement announcements)
{
ISession session = this._sessionManager.OpenSession();
session.Delete(announcements);
}
}
}
5.创建用于前台显示的用户控件 用来显示公告的标题 作者和发布时间.