hf

导航

 

工作中常会遇到同样的代码段,例如操作数据库就有打开连接、执行查询、异常处理、日志等,可能会这样写

返回一个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的用法。聪明的您应该可以看出它的问题所在吧!

posted on 2010-07-06 15:29  hf  阅读(429)  评论(0)    收藏  举报