檔案名稱:User.cs
using System;
using System.Data;
using System.Data.OleDb;
//using clubstar.IPlug;
using clubstar;
namespace clubstar.IPlug.DataOp
{
public struct UserTable //使用者表結構變數
{
public int id; //
public int sessionid;
public string name;
public string nickname; //
public string password; //
public bool sex; //
public DateTime birthday; //
public string city; //
public int weight; //
public int height; //
public string education; //
public int bloodtype; //
public string xingzuo;
public bool marry;
public string job; //
public string favorstar; //
public string favordo; //
public string introduce; //
public string email; //
public DateTime joindate; //
public DateTime logindate; //
public int rank; //
public string mobilephone; //
public string pic; //
public string pic_id; //
public int jifen; //
public int renqi; //
public int acceptwho; //
}
/// <summary>
/// User 的摘要說明。
/// </summary>
///
public class User: IPlugStarClub
{
public ConnDB_Op UserTable=ConnDB_Op.Instance(); //調用單體模式進行資料庫的串連
protected string SqlString="";
public User()
{
}
public User(string sql)
{
SqlString=sql;
}
#region IPlugStarClub Members
/// <summary>
/// 返回調用外掛程式的名稱
/// </summary>
public string Name
{
get
{
//return "User_Plugin:使用者表外掛程式";
return "clubstar.IPlug.DataOp.User";
}
}
/// <summary>
///使用者表操作
/// </summary>
/// <param name="context"></param>
public OleDbDataReader PerformSelect (IPlugSql sql)
{
//sql.SqlString=SqlString;
return UserTable.ExecuteReader(sql.SqlString);
}
public void PerformDelete (IPlugSql sql)
{
//sql.SqlString=SqlString;
UserTable.ExecuteNonQuery(sql.SqlString);
}
public void PerformInsert (IPlugSql sql)
{
//sql.SqlString=SqlString;
UserTable.ExecuteNonQuery(sql.SqlString);
}
public void PerformUpdate (IPlugSql sql)
{
//sql.SqlString=SqlString;
UserTable.ExecuteNonQuery(sql.SqlString);
}
#endregion
}
}
其中關於資料庫連接類的寫法如下
檔案名稱:ConnDB_Op.cs
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.OleDb;
using System.Configuration;
namespace clubstar.IPlug.DataOp
{
/// <summary>
/// ConnDB_Op 的摘要說明。
/// 採用 Facade 外觀設計模式以封裝所有與資料庫相關的操作
/// </summary>
public class ConnDB_Op
{
private OleDbDataAdapter da=new OleDbDataAdapter();
private DataSet ds=new DataSet();
private OleDbCommand cmd=new OleDbCommand();
public OleDbConnection MyConn;
public OleDbDataReader dr;
public string SqlString="";
public string StrConn="Provider=SQLOLEDB;"+ConfigurationSettings.AppSettings["clubstar"];
//資料庫連接採用Singleton 模式,只能通過Instance()來建立該類的唯一執行個體
private static ConnDB_Op conndb_op = null;
public static ConnDB_Op Instance()
{
if (null == conndb_op)
conndb_op = new ConnDB_Op();
return conndb_op;
}
private ConnDB_Op(string strconn,string sqlstring)
{
StrConn=strconn;
SqlString=sqlstring;
}
private ConnDB_Op()
{
}........
如下的檔案用於實際處理外掛程式的操作
檔案名稱:PluginSectionHandler.cs
using System;
using System.Xml;
using System.Configuration;
using clubstar.IPlug;
namespace clubstar
{
/// <summary>
/// This class implements IConfigurationSectionHandler and allows
/// us to parse the "plugin" XML nodes found inside App.Config
/// and return a PluginCollection object
/// </summary>
public class PluginSectionHandler:IConfigurationSectionHandler
{
public PluginSectionHandler()
{
}
#region IConfigurationSectionHandler Members
/// <summary>
/// Iterate through all the child nodes
/// of the XMLNode that was passed in and create instances
/// of the specified Types by reading the attribite values of the nodes
/// we use a try/Catch here because some of the nodes
/// might contain an invalid reference to a plugin type
/// </summary>
/// <param name="parent"></param>
/// <param name="configContext"></param>
/// <param name="section">The XML section we will iterate against</param>
/// <returns></returns>
///
public System.Web.HttpResponse dai;
public object Create(object parent, object configContext, System.Xml.XmlNode section)
{
PluginCollection plugins = new PluginCollection();
foreach(XmlNode node in section.ChildNodes)
{
try
{
//Use the Activator class's 'CreateInstance' method
//to try and create an instance of the plugin by
//passing in the type name specified in the attribute value
object plugObject = Activator.CreateInstance(Type.GetType(node.Attributes["type"].Value));//讀取WEBCONFIG中的相應配置節
//Cast this to an IPlugin interface and add to the collection
IPlugStarClub plugin = (IPlugStarClub)plugObject;
plugins.Add(plugin);
}
catch
{
//Catch any exceptions
//but continue iterating for more plugins
//dai.Write(section.ChildNodes.Count.ToString());
throw;
}
}
return plugins;
}
#endregion
}
}
而如下檔案用於擷取外掛程式的名字資訊:
檔案名稱:PlugSqlOp.cs
using System;
using clubstar.IPlug;
namespace clubstar
{
/// <summary>
/// UserOp 的摘要說明。
/// </summary>
public class PlugSqlOp:IPlugSql
{
private string m_User="";
public PlugSqlOp(string user)
{
m_User = user;
}
#region PlugSqlOp Members
public string SqlString
{
get
{
return m_User;
}
set
{
m_User = value;
}
}
#endregion
}
}
下面就是實際調用的程式原檔案
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Text;
using clubstar.IPlug;
using clubstar.IPlug.DataOp;
using clubstar.uc;
using clubstar.DataOp;
namespace clubstar
{
/// <summary>
/// WebForm1 的摘要說明。
/// </summary>
public class InsertUser : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Button Button1;
protected System.Web.UI.WebControls.Button Button2;
public RandomNum SessionID;
private void Page_Load(object sender, System.EventArgs e)
{
Common dai=new Common();
//session("verifycode")=rndnum
//Response.Write(SessionID.Text.ToString());
this.Button1.Click += new System.EventHandler(OnPluginClick);
}
public delegate void PerformInsert(string plugname,StringBuilder sql);
private void OnPluginClick(object sender,EventArgs args)
{
StringBuilder sql=new StringBuilder();
sql.Append("insert into clubuser (ID,sessionID,username) values (2,'123123','fuck')");
Common InsertUser=new Common();
PerformInsert Insert=new PerformInsert(InsertUser.PerformInsert);
Insert("clubstar.IPlug.DataOp.User",sql); //調用外掛程式所代理的方法
}
#region Web Form設計器產生的代碼
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 該調用是 ASP.NET Web Form設計器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 設計器支援所需的方法 - 不要使用代碼編輯器修改
/// 此方法的內容。
/// </summary>
private void InitializeComponent()
{
this.Button2.Click += new System.EventHandler(this.Button2_Click);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
private void Button2_Click(object sender, System.EventArgs e)
{
}
}
}
而上面檔案中的PerformInsert代理針對如下事件函數進行操作
using System;
using System.Configuration;
using clubstar.IPlug;
using System.Text;
using System.Data.OleDb;
namespace clubstar
{
/// <summary>
/// Common 的摘要說明。
/// </summary>
public class Common
{
public Common()
{
}
private PluginCollection m_plugins = null; //被回調用於對外掛程式進行插入操作
public void PerformInsert(string plugname,StringBuilder sql) //執行插入操作
{
m_plugins = (PluginCollection )ConfigurationSettings.GetConfig("IPlugs");
PlugSqlOp context = new PlugSqlOp(sql.ToString());
foreach(IPlugStarClub plugin in m_plugins)
{
if(plugin.Name==plugname)
{
plugin.PerformInsert(context);
return ;
}
}
}
public void PerformDelete(string plugname,StringBuilder sql)//執行刪除操作
{
m_plugins = (PluginCollection )ConfigurationSettings.GetConfig("IPlugs");
PlugSqlOp context = new PlugSqlOp(sql.ToString());
foreach(IPlugStarClub plugin in m_plugins)
{
if(plugin.Name==plugname)
{
plugin.PerformDelete(context);
return ;
}
}
}
public void PerformUpdate(string plugname,StringBuilder sql)//執行更新操作
{
m_plugins = (PluginCollection )ConfigurationSettings.GetConfig("IPlugs");
PlugSqlOp context = new PlugSqlOp(sql.ToString());
foreach(IPlugStarClub plugin in m_plugins)
{
if(plugin.Name==plugname)
{
plugin.PerformUpdate(context);
return ;
}
}
}
private OleDbDataReader dr;
public OleDbDataReader PerformSelect(string plugname,StringBuilder sql)//執行查詢操作
{
//OleDbDataReader dr=new OleDbDataReader();
m_plugins = (PluginCollection )ConfigurationSettings.GetConfig("IPlugs");
PlugSqlOp context = new PlugSqlOp(sql.ToString());
foreach(IPlugStarClub plugin in m_plugins)
{
if(plugin.Name==plugname)
{
dr=plugin.PerformSelect(context);
return dr;
}
}
return dr;
}
//如何使用上面的功能:先在前端檔案中產生如下代理:
//public delegate void PerformInsert(string plugname,StringBuilder sql);
//public delegate void PerformDelete(string plugname,StringBuilder sql);
//public delegate OleDbDataReader PerformSelect(string plugname,StringBuilder sql);
//public delegate void PerformUpdate(string plugname,StringBuilder sql);
/* 插入樣本
StringBuilder sql=new StringBuilder();
sql.Append("insert into clubuser (ID,sessionID,username) values (2,'123123','fuck')");
Common InsertUser=new Common();
PerformInsert Insert=new PerformInsert(InsertUser.PerformInsert);
Insert("clubstar.IPlug.DataOp.User",sql); //調用外掛程式所代理的方法
*/
/* 刪除樣本
StringBuilder sql=new StringBuilder();
sql.Append("delete from clubuser where ID=2");
Common DeleteUser=new Common();
PerformDelete Delete=new PerformDelete(DeleteUser.PerformDelete);
Delete("clubstar.IPlug.DataOp.User",sql); //調用外掛程式所代理的方法
*/
/* 查詢樣本
StringBuilder sql=new StringBuilder();
sql.Append("select * from clubuser where ID=2");
Common SelectUser=new Common();
PerformSelect Select=new PerformSelect(SelectUser.PerformSelect);
dr=Select("clubstar.IPlug.DataOp.User",sql); //調用外掛程式所代理的方法
do{
Response.Write(dr["username"].ToString()+"<br>");
Response.Write(dr["nickname"].ToString()+"<br><br>");
}
while(dr.Read());
*/
/* 更新樣本
StringBuilder sql=new StringBuilder();
sql.Append("update clubuser set ID=3 where ID=2");
Common UpdateUser=new Common();
PerformUpdate Update=new PerformUpdate(UpdateUser.PerformUpdate);
Update("clubstar.IPlug.DataOp.User",sql); //調用外掛程式所代理的方法
*/
}
}
最後,只需要在WEBCONFIG中寫入外掛程式的資訊就可以調用前面所寫的外掛程式了:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="IPlugs" type="clubstar.PluginSectionHandler, clubstar" />
</configSections>
<IPlugs>
<plugin type="clubstar.IPlug.DataOp.User" />
</IPlugs>.........