•
本系统是以B/S模式架构的基于角色控制的权限管理系统,系统由本人跟标仔两人共同开发,开发工具为vs.net2003,开发语言为C#,可用于综合性网站的统一权限管理。
基于解决方案的需要,主要用到了以下五种设计模式:
•
为了支持对不同数据库的访问,用到抽象工厂设计模式
•
为了产生单一工厂,用到单件设计模式
•
为用户提供统一的高层接口,封装业务逻辑,使用外观设计模式
•
为了实现用户对密码加密的不同需求,用到策略模式
•
子系统使用该权限系统,不需要集成该系统,直接使用系统提供的WebService访问,使用代理模式,实现松散的耦合。
类模型图
数据库模型图
权限管理系统整体架构
本系统是基于经典的三层模式扩展的N层模
式,其中:
Web层即用户界面层,跟用户打交道的;
BLLFacade层即业务逻辑外观层,定义了
一个高层接口, Web层只需要调用该层提
供的简单接口;
BLL层即业务逻辑层,核心的业务逻辑代码都在此模块中;
IDAL层即数据访问对象接口层,为BLL层
即业务逻辑层提供一致的数据访问接口;
OracleDAL层即Oracle数据库访问对象层,实现IDAL层的所有接口;
SQLServerDAL层即SQLServer数据库访问对象层,实现IDAL层的所有接口;
Model层即数据实体层;
Utility层即通用工具类层,相当于一个工具包;
下面组件图显示了各个项目的调用关系
在本系统中,要创建的数据访问对象包括Users, UserRoles , Roles ,RolePowers , Powers, Categories。在设计中,这些对象已经被抽象为对应的接口,而其实现则根据数据库的不同而有所不同。
.......
也就是说,创建的对象有多种类别,而每种类别又有不同的实现,这是典型的抽象工厂模式的应用场景。可以通过抽象工厂模式来解决。标准的抽象工厂模式类图如下:
using System;
namespace PowerManage
{
/// <summary>
/// 抽象工厂设计模式,用到了单例设计模式
/// </summary>
public abstract class DALFactory
{
private static DALFactory Instance=null;
private static readonly string DBProvider = System.Configuration.ConfigurationSettings.AppSettings["DBProvider"];
//构造函数为保护函数,确保抽象工产只有一个实例
protected DALFactory()
{
}
//获取抽象工程的唯一实例
public static DALFactory GetInstance()
{
if(Instance==null)
{
switch(DBProvider)
{
case "SQLServerDB":
Instance = new SQLServerDALFactory();
break;
case "OracleDB":
Instance = new OracleDALFactory();
break;
default:
Instance = new SQLServerDALFactory();
break;
}
}
return Instance;
{
/// <summary>
/// 抽象工厂设计模式,用到了单例设计模式
/// </summary>
public abstract class DALFactory
{
private static DALFactory Instance=null;
private static readonly string DBProvider = System.Configuration.ConfigurationSettings.AppSettings["DBProvider"];
//构造函数为保护函数,确保抽象工产只有一个实例
protected DALFactory()
{
}
//获取抽象工程的唯一实例
public static DALFactory GetInstance()
{
if(Instance==null)
{
switch(DBProvider)
{
case "SQLServerDB":
Instance = new SQLServerDALFactory();
break;
case "OracleDB":
Instance = new OracleDALFactory();
break;
default:
Instance = new SQLServerDALFactory();
break;
}
}
return Instance;
}
//创建Categories数据层接口
public abstract PowerManage.IDAL.ICategories CreateCategories();
//创建Powers数据层接口
public abstract PowerManage.IDAL.IPowers CreatePowers();
//创建RolePowers数据层接口
public abstract PowerManage.IDAL.IRolePowers CreateRolePowers();
//创建Roles数据层接口
public abstract PowerManage.IDAL.IRoles CreateRoles();
//创建UserRoles数据层接口
public abstract PowerManage.IDAL.IUserRoles CreateUserRoles();
//创建Users数据层接口
public abstract PowerManage.IDAL.IUsers CreateUsers();
}
}
//创建Categories数据层接口
public abstract PowerManage.IDAL.ICategories CreateCategories();
//创建Powers数据层接口
public abstract PowerManage.IDAL.IPowers CreatePowers();
//创建RolePowers数据层接口
public abstract PowerManage.IDAL.IRolePowers CreateRolePowers();
//创建Roles数据层接口
public abstract PowerManage.IDAL.IRoles CreateRoles();
//创建UserRoles数据层接口
public abstract PowerManage.IDAL.IUserRoles CreateUserRoles();
//创建Users数据层接口
public abstract PowerManage.IDAL.IUsers CreateUsers();
}
}
Oracle数据库访问对象工厂
public class OracleDALFactory:DALFactory
{
//创建Categories数据层接口
public override PowerManage.IDAL.ICategories CreateCategories()
{
return new PowerManage.OracleDAL.Categories();
}
………………
}
SQLServer数据库访问对象工厂
public class SQLServerDALFactory:DALFactory
{
//创建Categories数据层接口
public override PowerManage.IDAL.ICategories CreateCategories()
{
return new PowerManage.SQLServerDAL.Categories();
}
………………
}
例如,BLL层创建SQL Server数据库的的Users对象如下:
DALFactory factory = new DALFactory.GetInstance();
private static readonly IUsers users = factory CreateUsers();
private static readonly IUsers users = factory CreateUsers();
权限管理系统部署好数据库后,程序一旦执行,数据访问工厂就必须确定,而Singleton设计模式是告诉您如何在你的应用程序创建一个唯一类实例的全局对象,也就是说,这个对象只能被实例化一次,这个对象同时提供一个访问它的一个全局的访问点。这里的数据访问工厂只能被实例化一次。
标准的单件模式类图如下:
策略模式
/// <summary>
/// 加密策略接口
/// </summary>
public interface EncryptStrategy
{
/// 加密策略接口
/// </summary>
public interface EncryptStrategy
{
//对字符串进行密钥加密
string Encrypting(string Source, string Key);
/// <summary>
/// 对字符串进行密钥解密
/// </summary>
string Decrypting(string Source, string Key) ;
}
string Encrypting(string Source, string Key);
/// <summary>
/// 对字符串进行密钥解密
/// </summary>
string Decrypting(string Source, string Key) ;
}
外观模式
代理模式
using System.Diagnostics;
using System.Xml.Serialization;
using System;
using System.Web.Services.Protocols;
using System.ComponentModel;
using System.Web.Services;
using System.Xml.Serialization;
using System;
using System.Web.Services.Protocols;
using System.ComponentModel;
using System.Web.Services;
/// <remarks/>
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Web.Services.WebServiceBindingAttribute(Name="UserSoap", Namespace="http://tempuri.org/")]
public class WebServiceUserProxy : System.Web.Services.Protocols.SoapHttpClientProtocol
{
/// <remarks/>
public WebServiceUserProxy()
{
this.Url = "http://localhost/Web/Service/User.asmx";
}
/// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/Login", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public string Login(string UserName, string Password, string Category)
{
object[] results = this.Invoke("Login", new object[] {
UserName,
Password,
Category});
return ((string)(results[0]));
}
/// <remarks/>
public System.IAsyncResult BeginLogin(string UserName, string Password, string Category, System.AsyncCallback callback, object asyncState)
{
return this.BeginInvoke("Login", new object[] {
UserName,
Password,
Category}, callback, asyncState);
}
/// <remarks/>
public string EndLogin(System.IAsyncResult asyncResult)
{
object[] results = this.EndInvoke(asyncResult);
return ((string)(results[0]));
}
/// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/CheckPower", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public string CheckPower(string UserName, string Password, string Category, string Power)
{
object[] results = this.Invoke("CheckPower", new object[] {
UserName,
Password,
Category,
Power});
return ((string)(results[0]));
}
/// <remarks/>
public System.IAsyncResult BeginCheckPower(string UserName, string Password, string Category, string Power, System.AsyncCallback callback, object asyncState)
{
return this.BeginInvoke("CheckPower", new object[] {
UserName,
Password,
Category,
Power}, callback, asyncState);
}
/// <remarks/>
public string EndCheckPower(System.IAsyncResult asyncResult)
{
object[] results = this.EndInvoke(asyncResult);
return ((string)(results[0]));
}
}