日期:2014-05-17  浏览次数:20483 次

关于using中的类提升到Property
public class Service
{
    public List<A> GetA()
    {
        using (DatabaseHelper helper = new DatabaseHelper())
        {
            ...//Get A
        }
    }

    public List<B> GetB()
    {
        using (DatabaseHelper helper = new DatabaseHelper())
        {
            ...//Get B
        }
    }
}


因为DatabaseHelper实现了Dispose接口,所以只要using就可以省去connection close相关操作。
但是现在的问题是,用户在使用的时候,
Service service = new Service();
service.GetA();
service.GetB();
这建立了两次数据库连接。有没有什么办法把DatabaseHelper作为Service的Property,并且能够调用using方式吗?
------解决方案--------------------
昨天我也纠结类似的问题,后来发现,在连接池里有连接的情况下,
SqlConnection conn = new SqlConnection(xxx);
conn.Open();
conn.Close();
这三个操作加起来只用了0.015毫秒左右,我的是普通双核笔记本。
------解决方案--------------------
把DatabaseHelper放到Service中来维护,然后要实现IDispose接口,因为你维护的是一个已经实现IDispose接口的DatabaseHelper对象,所以Service类自己也必须实现。

public class Service:IDispose
{
    DatabaseHelper?helper;
    public List<A> GetA(){...}
    public List<B> GetB(){...}

    bool disposed = false;

    Dispose(byManual)
    {
        if(!disposed)
        {
            //第一次释放
            if(byManual)
            {
                //释放托管资源代码
            }

            //释放非托管资源代码
            helper.Dispose();
        }
        disposed = true;
    }

    //手动Dispose()或using释放非托管资源
    public void Dispose(){
        Dispose(true);
        //取消终结,则不会调用~Service()
        GC.SuppressFinalize(this);
    }

    //析构自动释放非托管资源
    ~Service()
    {
        Dispose(false);
    }
}