多层架构的实现

来源:互联网 发布:war包反编译成源码 编辑:程序博客网 时间:2024/05/01 19:07

 以下是使用抽象工厂模式,以应对数据库的变化,也即可以写两个(或多个)数据层,一个SQL SERVER的一个ORCAL的,都继承接口,只要在web.config中设置,便可以随便你使用哪个数据库

如果确定始终使用的是一个数据库,那么可以把接口层和数据工厂去掉

1,先定义实体类(Model层),把一条新闻抽象为一个实体对象,对新闻的操作就是对这个实体的操作
namespace Chinaz.Model
{
/// <summary>
/// 新闻实体类
/// </summary>
public class NewsInfo
{
private Int32 m_NewsID;
private String m_Title;//文章标题
private String m_Content;//文章内容
                  public NewsInfo(Int32 newsID,String title,String content)
{
this.m_NewsID = newsID;
this.m_Title = title;
this.m_Content = content;
}
public Int32 NewsID
{
get { return m_NewsID;}
set { m_NewsID = value;}
}
///<summary>
///文章标题
///</summary>
public String Title
{
get { return m_Title;}
set { m_Title = value;}
}
///<summary>
///文章内容
///</summary>
public String Content
{
get { return m_Content;}
set { m_Content = value;}
}
           }
}
2,定义接口====
using System;
using Chinaz.Model;
namespace Chinaz.IDAL
{
/// <summary>
/// 作用:新闻文章的接口
/// 作者:
/// 日期:
/// </summary>
public inte***ce INews
{
                   /// <summary>
/// 添加一篇文章
/// </summary>
/// <param name="p_newsinfo">newsinfo对象</param>
void Insert(Model.NewsInfo p_newsinfo);
          }
}
3.写数据层===========继承接口(News:IDAL.INews)===使用参数和存储过程(提高效率,安全性)
using System;
using System.Data;
using System.Data.SqlClient;
using System.Collections;
using Chinaz.Model;
namespace Chinaz.SQLServerDAL
{
public class News:IDAL.INews //继承接口
{
public News()
{

}
                  /// <summary>
/// 添加一篇文章
/// </summary>
/// <param name="p_newsinfo">newsinfo对象(MODEL层)</param>
public void Insert(NewsInfo p_newsinfo)
{
SqlParameter[] parms={
        new SqlParameter("@Title",SqlDbType.VarChar,50),
        new SqlParameter("@Content",SqlDbType.NText)
                                   }
                           parms[0].Value=p_newsinfo.Title;
parms[1].Value=p_newsinfo.Content;
                           try
{
SQLHelper.ExecuteNonQuery(SQLHelper.CN_STRING,CommandType.StoredProcedure,"News_Insert",parms);
}
catch(Exception ex)
{
throw ex;
}
                  }
           }
}
3,数据工厂========通过配置web.config 中的WebDAL值,利用工厂模式+反射机制,实现动态创建不同的数据层对象接口
using System;
using System.Reflection;
using System.Configuration;

namespace Chinaz.DALFactory
{
/// <summary>
/// 作用:工厂类,
/// 作者:
/// 日期:
/// </summary>
public class News
{
public static Chinaz.IDAL.INews Create()
{
string path = System.Configuration.ConfigurationSettings.AppSettings["WebDAL"];//web.config 中设置使用哪个数据层
string className = path + ".News";
return (Chinaz.IDAL.INews) Assembly.Load(path).CreateInstance(className);
}
}
}
4,逻辑层====此处很重要的,举个例子比如:有多个页面执行Insert(Model.NewsInfo model)[只是假设有],到程序写完的时候,需求变化了,要求添加的新闻的标题都加上“《》”,即《标题》,那么只要在逻辑层处理model.Title="《"+model.Title+"》";而不要去每个页面找
Insert操作并加上“《》”(有点象一夫当关,所有的“对象”都要经过这个出口);这只是举个非常简单的例子,而实际上要复杂的多
using System;
using System.Data;
using System.Text;
using Chinaz.IDAL;
using Chinaz.DALFactory;
using Chinaz.Model;
using System.Collections;
namespace Chinaz.BLL
{
/// <summary>
/// 作者:
/// </summary>
public class News
{
public News()
{
}
         /// <summary>
/// 增加一条数据
/// </summary>
public void Insert(Model.NewsInfo model)
{
                            //此处对model进行一些必要的过滤,安全验证等等逻辑
                            //如model.Title=model.Title.Replace("'","");等等
Chinaz.IDAL.INews dal=Chinaz.DALFactory.News.Create();
dal.Insert(model);
}
          }
}
5,表示层 aspx.cs==========基本上不处理什么,只是给对象赋值和把值在页面表示出来

model.Title=文本筐的值
model.Content=文本筐的值