在做网站的时候我把BLL和DAL分开,在BLL调用DAL的代码时遇到了三种选择:
一、在DAL中使用静态方法,不创建实例直接调用:
class DAL
{
    public static string GetUserName(...);
}
在BLL中调用:
DAL.GetUserName();二、在DAL中使用实例方法,采用静态成员模式(或Singleton)通过实例来调用:
class DAL
{
    public static readonly DAL dal = new DAL();
    public string GetUserName(...);
}
在BLL中调用:
DAL.dal.GetUserName();三、在DAL中使用实例方法,每次调用之前先创建DAL对象的实例:
class DAL
{
    public string GetUserName(...);
}
在BLL中调用:
DAL dal = new DAL();
dal.GetUserName();这三种方式我都在实际项目中见过,都能实现一样的功能,但是想不出来他们有什么区别,或者三种方案的适用范围。
请问以上三种方案哪种更好?或者三种方案分别在什么情况下使用最好?
欢迎讨论!

解决方案 »

  1.   

    不是很清楚lz把DAL封装到什么程度了,只就给出来的代码随便拍几砖
    我姑且把 UserName 认为是连接数据库时使用的用户名方式一:
    在数据库只有一个的情况下,没有什么问题,但在GetUserName()内部要注意考虑线程安全以及其他的一些问题。方式二:
    看着比较奇怪的使用方式。在静态成员模式下一般习惯使用factory的方式去创建这个成员,而且这种方式下整个系统中只有一个dal对象,莫非是CS的结构?方式三:
    可以兼顾各种情况,所以使用的相对多一些。
      

  2.   

    感谢楼上的各位朋友我喜欢用第一种的静态方法,觉得这种方法最干净,调用起来最方便
    微软在Petshop 2及以前的版本中使用的就是这种方法
    但是微软在Petshop 3中改成了第三种方法,并在介绍中说明了这是一项改进
    只是我不明白是为什么,是不是说第三种方法比第一种方法好吗?mmqingfeng(漠漠青峰):
    你所说的可以兼顾各种情况出了线程问题以外还有什么情况?