今天看一个同事写的代码.是一个小网站,三层架构的那种...代码如下:
  
在ASPX里:protected void xxx1_Click(object sender, EventArgs e)
        {
            IList<Model.Category> list = Swdl.BLL.CategoryBLL.Value.GetAllList();    
        }BLL层的大致方法:namespace Swdl.BLL
{
public partial class CategoryBLL
{
private static CategoryBLL _value;
//静态BLL成员
        public static CategoryBLL Value
        {
get{
if (CategoryBLL._value == null)
                    CategoryBLL._value = new CategoryBLL();
                return CategoryBLL._value;}}        public IList<Model.Category>GetAllList(){ return CategoryDAL.Value.GetAllList();}}
}
在DLL层的大致方法:namespace Swdl.DAL
{
public partial class CategoryDAL
{private static CategoryDAL _value;
        public static CategoryDAL Value
        {
            get
            {
                if (CategoryDAL._value == null)
                    CategoryDAL._value = new CategoryDAL();
                return CategoryDAL._value;
            }
        }public IList<Model.Category>GetAllList(){ //数据库操作代码}
}
}实在不太明白,这样的话每个BLL/DLL层的类网站只有一个实例,我就是想问,这样不会出现什么问题吗?比如说:一个请求需要很长时间处理完的话,后面的请求会不会等结束了才会处理,或者线程方面的问题..

解决方案 »

  1.   

    这不叫静态类,叫单例模式,为了线程的安全,一个实例只能实例化一次
    不会出现一个请求需要很长时间处理完的话,后面的请求会不会等结束了才会处理这种情况,因为web应用是多线程的
      

  2.   


    这不是单例模式,这就是使用静态变量来更加方便的达到需求。《设计模式》是很早的书,GOF不可能懂.net中的先进的的东西。
      

  3.   

    实际上GOF连微软在1990年前已经广泛使用的事件驱动模式也不懂,所以才会出现那么多奇怪的模式来。回到单例模式,尽管可以与时俱进,但是最起码的特征还是要遵守的。比如说你可以在Category类中写一个static的GetInstance方法来获取一个Category类实例(而使用new Category()则不支持),这是单例模式。这种必须类型自己连环套自己的的实例的作茧自缚的流程,才是单例模式。