如何重构重复的 IDbConnection.open\close?
How to refactor repeating IDbConnection.open\close?
也许这是个愚蠢的问题,但我把自己搞糊涂了。
我将 Dapper 与 Autofac (DI) 一起使用,在我的业务层中,我总是使用以下结构:
db.Open(); //db is IDbConnection instance
db.InsertOrDeleteOrUpdate(...)
db.Close();
通过委托方法隐藏db.Open() 和db.Close() 是否是一个好的解决方案?例如:
dbHelper.do(db => db.InsertOrDeleteOrUpdate(...));
遇到这种情况怎么办?
冗余代码不是此代码中的唯一问题。您的代码正在为每个操作访问数据库。如果您的 DBServer 部署在远程计算机上,这将影响性能。参考 this 答案。
你遇到过 UnitOfWork 模式吗?这是处理更高级别连接的非常好的解决方案。
Connection Factory 是另一个不错的选择,它可以与 UnitOfWork 一起使用。但我个人更喜欢 UnitOfWork.
UnitOfWork 的示例代码请参考 this 答案。
从上面选择后,使用"connection per request" 模式很容易减少冗余。您需要确定代码中的集中位置,在哪里创建 DalSession
以及在哪里处置它。
也许这是个愚蠢的问题,但我把自己搞糊涂了。 我将 Dapper 与 Autofac (DI) 一起使用,在我的业务层中,我总是使用以下结构:
db.Open(); //db is IDbConnection instance
db.InsertOrDeleteOrUpdate(...)
db.Close();
通过委托方法隐藏db.Open() 和db.Close() 是否是一个好的解决方案?例如:
dbHelper.do(db => db.InsertOrDeleteOrUpdate(...));
遇到这种情况怎么办?
冗余代码不是此代码中的唯一问题。您的代码正在为每个操作访问数据库。如果您的 DBServer 部署在远程计算机上,这将影响性能。参考 this 答案。
你遇到过 UnitOfWork 模式吗?这是处理更高级别连接的非常好的解决方案。
Connection Factory 是另一个不错的选择,它可以与 UnitOfWork 一起使用。但我个人更喜欢 UnitOfWork.
UnitOfWork 的示例代码请参考 this 答案。
从上面选择后,使用"connection per request" 模式很容易减少冗余。您需要确定代码中的集中位置,在哪里创建 DalSession
以及在哪里处置它。