哪个是在类中进行数据库连接的更好方法?

时间:2012-12-17 19:06:53

标签: c# asp.net-mvc

1)使用类

中的方法设置连接
//controller
using(Connection conn = new Connection()){
 conn.Open();
 MyClass myclass = new MyClass();
 myclass.setDbConnection(conn);
}

//MyClass in Model
class MyClass {
    Connection conn;

    public setDbConnection(conn){
        this.conn = conn;
    }

    public updateTableA(){
        //using this.conn;
    }
    public updateTableB(){
        //using this.conn;
    }
    public updateTableC(){
        //using this.conn;
    }

}

2)将连接传递给每个方法作为参数

//controller
using(Connection conn = new Connection()){
 conn.Open();
 MyClass myclass = new MyClass();
}


//MyClass in Model
class MyClass {

    public updateTableA(Connection conn){
        //using conn;
    }
    public updateTableB(Connection conn){
        //using conn;
    }
    public updateTableC(Connection conn){
        //using conn;
    }
}

哪种方式(或更好)?为什么?

2 个答案:

答案 0 :(得分:3)

答案是,确实没有一个好方法,因为这种模式本质上是有缺陷的。您的数据对象不应该负责维护数据库连接,也不应该与数据库设计紧密耦合。对于大多数数据库应用程序,对象关系管理器已经证明它们是更好的方法。您应该研究一些流行的实体,如Entity Framework或nHibernate。我个人使用nHibernate。

答案 1 :(得分:2)

鉴于你的两个选项,我肯定会选择第一个选项 - 将连接传递给每个方法绝对没有其他值(假设你总是使用相同的连接)。这只会给你的代码增加很多噪音,掩盖了实际的业务逻辑。

此外,我建议将连接传递给构造函数,并避免使用setDbConnection方法。这可以确保在调用构造函数之后有一个工作对象,而不是在调用此方法之前会失败的工作对象。但这并不总是可行的,因此这种初始化方法有时是不可避免的。

最后你应该考虑实现IDisposable,因为你的类拥有一个可支配的资源 - 连接 - 因此可能有责任在它们的生命周期结束时释放它。

我绝对支持其他用户已经说过 - 考虑使用像Entity Framework这样的OR-mapper,因为滚动你自己的数据访问层真的不是一件容易的事。