Unit Of Work Pattern(ORM Transaction Controller) Implementation Sample

1. Transaction Unit Entity

 public class TransactionUnitBase
    {
        public ActionType ThisActionType { get; set; }
    }

    public class TransactionUnit<TIn,TOut> : TransactionUnitBase
    {
        public Func<TIn,TOut> UnitAction { get; set; }
        public TIn ActionParam { get; set; }
    }

    public class TransactionUnit<TIn> : TransactionUnitBase
    {
        public Action<TIn> UnitAction { get; set; }
        public TIn ActionParam { get; set; }
    }

    public class TransactionUnitNoParam<TOut> : TransactionUnitBase
    {
        public Func<TOut> UnitAction { get; set; }
    }


2.ActionType

 public enum ActionType
    {
        BothParamAndReturn,
        ParamOnly,
        ReturnOnly
    }


3.TransactionUnit Manager

 public class TransactionUnitManager : ITransactionUnit
    {
        private readonly List<dynamic> _currentWorks;

        public TransactionUnitManager()
        {
            _currentWorks = new List<dynamic>();
        }
        public ITransactionUnit AddWorkUnit<TParam, TReturn>(Func<TParam, TReturn> work,TParam pamameter)
        {
            var unitOfWork = new TransactionUnit<TParam,TReturn>
                {
                    ThisActionType = ActionType.BothParamAndReturn,
                    ActionParam = pamameter,
                    UnitAction = work
                };

            _currentWorks.Add(unitOfWork);
            return this;
        }

        public ITransactionUnit AddWorkUnit<TParam>(Action<TParam> work,TParam parameter)
        {

            var unitOfWork = new TransactionUnit<TParam>
            {
                ThisActionType = ActionType.ParamOnly,
                ActionParam = parameter,
                UnitAction = work
            };
            _currentWorks.Add(unitOfWork);
            return this;
        }

        public ITransactionUnit AddWorkUnit<TReturn>(Func<TReturn> work)
        {
            var unitOfWork = new TransactionUnitNoParam<TReturn>
            {
                ThisActionType = ActionType.ReturnOnly,
                UnitAction = work
            };
            _currentWorks.Add(unitOfWork);
            return this;
        }

        public void CommitTransaction()
        {
            try
            {
                using (var scope = new TransactionScope(TransactionScopeOption.Required, TimeSpan.FromMinutes(10)))
                {
                    foreach (var t in _currentWorks)
                    {
                        if (t.ThisActionType == ActionType.BothParamAndReturn)
                        {
                            t.UnitAction(t.ActionParam);
                        }
                        else if (t.ThisActionType == ActionType.ParamOnly)
                        {
                            t.UnitAction(t.ActionParam);
                        }
                        else if (t.ThisActionType == ActionType.ReturnOnly)
                        {
                            t.UnitAction();
                        }
                    }

                    scope.Complete();
                }
            }
            finally
            {
                _currentWorks.Clear();
            }

        }
    }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值