0

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;
    }
}

哪个是正确(或更好)的方式?为什么?

4

2 回答 2

3

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

于 2012-12-17T19:12:30.207 回答
2

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

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

最后,您应该考虑实现IDisposable,因为您的类拥有一次性资源 - 连接 - 因此可能负责在其生命周期结束时释放它。

And I definitely support what other users already said - think about using an OR-mapper like Entity Framework because rolling your own data access layer is really not trivial.

于 2012-12-17T19:16:01.700 回答