首页 > 代码库 > 简单了解UnitOfWork

简单了解UnitOfWork

UnitOfWork

Unit Of Work模式,即工作单元,它是一种数据访问模式。它是用来维护一个由已经被业务修改(如增加、删除和更新等)的业务对象组成的列表。它负责协调这些业务对象的持久化工作及并发问题。那它是怎么来维护的一系列业务对象组成的列表持久化工作的呢?通过事务。Unit Of Work模式会记录所有对象模型修改过的信息,在提交的时候,一次性修改,并把结果同步到数据库。 这个过程通常被封装在事务中。所以在DAL中采用Unit Of Work模式好处就在于能够确保数据的完整性,如果在持有一系列业务对象(同属于一个事务)的过程中出现问题,就可以将所有的修改回滚,以确保数据始终处于有效状态,不会出现脏数据。

实现UnitOfWork

当然实现UnitOfWork的方式有很多,但是最重要的一点是维持数据操作发生在同一个DbContext之中,

建立IUnitOfWork

    public interface IUnitOfWork    {        void Commit();        void Rollback();    }

实现UnitOfWork

    public class UnityOfWork : IUnitOfWork    {        private DbContext _context;        public UnityOfWork(DbContext context)        {            if (null == context)            {                throw new ArgumentNullException("context");            }            _context = context;        }        public void Commit()        {            this._context.SaveChanges();        }        public void Rollback()        {            _context.ChangeTracker.Entries().ToList().ForEach(                entity => entity.State = EntityState.Unchanged                ); //回滚        }    }

简单的通过一个类实现DbContext访问,当然也可通过Ioc方式实现:

    public class ContextFactory    {        private static DbContext context;        public static DbContext Get() {            if (null == context) {                context = new BlogEntities() as DbContext;            }            return context;        }    }

之后就可以使用对应的Commit和Rollback了:

        public ResultCode DeleteBlog(int id)        {            try            {                _blogRep.DeleteBy(b => b.Id == id);                _commentRep.DeleteBy(c => c.BlogId == id);                _blogRep.Add(new Tb_Article());                unitOfWork.Commit();                return ResultCode.MSG_ARTICLE_DELETE_SUCCESS;            }            catch (Exception ex)            {                unitOfWork.Rollback();                throw ex;            }        }

当程序发生异常时就可进行相应回滚。

不妥之处欢迎大家指正。

简单了解UnitOfWork