首页 新闻 会员 周边

以下代码怎么优化使代码重用率最高

0
悬赏园豆:80 [待解决问题]

该代码的用途是使调用EF的dbContext相关操作时,将具体方法用最低隔离级别的事务包裹起来执行,达到类似with(nolock)的效果。为了使其通用,写了以下代码。但不知道是否可以用什么方法把该代码写的更精简。

 

   public static class EFHelper  
    {
        public static T2 Invoke<T1, T2>(Func<T1, T2> func, T1 t1)
        {
            var opt = new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted };
            T2 res = default(T2);
            using (var sc = new System.Transactions.TransactionScope(TransactionScopeOption.Required, opt))
            {
                try
                {
                    res = func(t1);
                    sc.Complete();
                }
                catch (Exception)
                {
                    sc.Dispose();
                    throw;
                }
            }
            return res;
        }
        public static T3 Invoke<T1, T2, T3>(Func<T1, T2, T3> func, T1 t1, T2 t2)
        {
            var opt = new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted };
            T3 res = default(T3);
            using (var sc = new System.Transactions.TransactionScope(TransactionScopeOption.Required, opt))
            {
                try
                {
                    res = func(t1, t2);
                    sc.Complete();
                }
                catch (Exception)
                {
                    sc.Dispose();
                    throw;
                }
            }
            return res;
        }

        public static T1 Invoke<T1>(Func<T1> func)
        {
            var opt = new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted };
            T1 res = default(T1);
            using (var sc = new System.Transactions.TransactionScope(TransactionScopeOption.Required, opt))
            {
                try
                {
                    res = func();
                    sc.Complete();
                }
                catch (Exception)
                {
                    sc.Dispose();
                    throw;
                }
            }
            return res;
        }

        public static void Invoke<T1>(Action<T1> action, T1 t1)
        {
            var opt = new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted };
            using (var sc = new System.Transactions.TransactionScope(TransactionScopeOption.Required, opt))
            {
                try
                {
                    action(t1);
                    sc.Complete();
                }
                catch (Exception)
                {
                    sc.Dispose();
                    throw;
                }
            }
        }
        public static void Invoke(Action action)
        {
            var opt = new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted };
            using (var sc = new System.Transactions.TransactionScope(TransactionScopeOption.Required, opt))
            {
                try
                {
                    action();
                    sc.Complete();
                }
                catch (Exception)
                {
                    sc.Dispose();
                    throw;
                }
            }
        }
    }
Tony二师弟的主页 Tony二师弟 | 菜鸟二级 | 园豆:204
提问于:2015-03-04 12:44
< >
分享
所有回答(2)
0

你是在搞笑吗,晕死了都

代码小兵的成长 | 园豆:303 (菜鸟二级) | 2015-03-04 14:20

你晕啥

支持(0) 反对(0) Tony二师弟 | 园豆:204 (菜鸟二级) | 2015-03-04 18:16
0

不切实际,

吴瑞祥 | 园豆:29449 (高人七级) | 2015-03-05 09:23

            Action<int> delAction = (x) =>
            {
                var db = new Entities();

      //do work
            };
            EFHelper.Invoke(delAction, ID);

我可以这样调用;否则要写这么多代码:

 public static void Invoke<T1>(Action<T1> action, T1 t1)
        {
            var opt = new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted };
            using (var sc = new System.Transactions.TransactionScope(TransactionScopeOption.Required, opt))
            {
                try
                {
                    var db = new Entities();

      //do work


                    sc.Complete();
                }
                catch (Exception)
                {
                    sc.Dispose();
                    throw;
                }
            }
        }

你为什么说不切实际呢??

支持(0) 反对(0) Tony二师弟 | 园豆:204 (菜鸟二级) | 2015-03-05 12:59

@Tony Tan: 首先nolock很不好

然后最好不要用分布式事务

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2015-03-05 13:44

@吴瑞祥: 恩,是的。不过我们公司要求这样,即使写sql,任何时候都要加上with(nolock)。另外此处未涉及到分布式事务。

我是想问,如果那位熟悉设计模式的,该代码是否可以优化,跟踪参数的个数和是否含返回类型,可能需要很多个重载。

支持(0) 反对(0) Tony二师弟 | 园豆:204 (菜鸟二级) | 2015-03-05 15:01

@Tony Tan: 是查询的时候要加上nolock吧,事务操作的时候加nolock怎么保证一致性?

尤其像你这样搞,怎么保证不出并发错误,

System.Transactions.TransactionScope 就是分布式事务。

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2015-03-05 16:10

@吴瑞祥: 有什么并发错误?只是select出来的有脏数据而已,脏数据是允许的,但是影响关键业务的性能是不允许的。用这个nolock的是非关键业务。

System.Transactions.TransactionScope 不一定是分布式事务。只有资源分布在不同的机器才存在分布式事务。

支持(0) 反对(0) Tony二师弟 | 园豆:204 (菜鸟二级) | 2015-03-05 16:34
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册