工作中常会遇到同样的代码段,例如操作数据库就有打开连接、执行查询、异常处理、日志等,可能会这样写
返回一个Model
public T Execute<T>(IDbCommand cmd) {
using (cmd) {
if (cmd.Connection == null) {
cmd.Connection = CreateConnection();
}
using (cmd.Connection) {
cmd.Connection.Open();
try {
return cmd.ExecuteReader().ToModel<T>();
}
catch (Exception ex) {
cmd.Connection.Close();
logger.ErrorException("", ex);
throw;
}
}
}
}
执行查询
public int ExecuteNonQuery(IDbCommand cmd) {
using (cmd) {
cmd.Connection = CreateConnection();
using (cmd.Connection) {
cmd.Connection.Open();
int affect;
try {
affect = cmd.ExecuteNonQuery();
}
catch (Exception ex) {
logger.ErrorException("", ex);
throw;
}
return affect;
}
}
}
上边都有类似的逻辑,有没有办法简化呢?
我们发现不同的只是try 里的内容,所以可以写这样一个方法:
public T DoExecute<T>(IDbCommand cmd, Func<IDbCommand, T> func) {
using (cmd) {
T obj;
if (cmd.Connection == null) {
cmd.Connection = CreateConnection();
}
cmd.Connection.Open();
using (cmd.Connection) {
try {
obj = func(cmd);
}
catch (Exception ex) {
logger.ErrorException("", ex);
throw;
}
}
return obj;
}
}
现在第一个就可以这样:
public T Execute<T>(IDbCommand cmd) {
return DoExecute(cmd, p => p.ExecuteReader().ToModel<T>());
}
第二个:
public int ExecuteNonQuery(IDbCommand cmd) {
return DoExecute(cmd, p => p.ExecuteNonQuery());
}
会不会方便一点呢。:)
以上DoExecute是有问题的……,这里只是为了演示Func的用法。聪明的您应该可以看出它的问题所在吧!
浙公网安备 33010602011771号