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;
}
}
哪种方式(或更好)?为什么?
答案 0 :(得分:3)
答案是,确实没有一个好方法,因为这种模式本质上是有缺陷的。您的数据对象不应该负责维护数据库连接,也不应该与数据库设计紧密耦合。对于大多数数据库应用程序,对象关系管理器已经证明它们是更好的方法。您应该研究一些流行的实体,如Entity Framework或nHibernate。我个人使用nHibernate。
答案 1 :(得分:2)
鉴于你的两个选项,我肯定会选择第一个选项 - 将连接传递给每个方法绝对没有其他值(假设你总是使用相同的连接)。这只会给你的代码增加很多噪音,掩盖了实际的业务逻辑。
此外,我建议将连接传递给构造函数,并避免使用setDbConnection
方法。这可以确保在调用构造函数之后有一个工作对象,而不是在调用此方法之前会失败的工作对象。但这并不总是可行的,因此这种初始化方法有时是不可避免的。
最后你应该考虑实现IDisposable
,因为你的类拥有一个可支配的资源 - 连接 - 因此可能有责任在它们的生命周期结束时释放它。
我绝对支持其他用户已经说过 - 考虑使用像Entity Framework这样的OR-mapper,因为滚动你自己的数据访问层真的不是一件容易的事。