码迷,mamicode.com
首页 > 其他好文 > 详细

领域驱动设计案例之仓储顶层实现

时间:2015-11-27 12:30:30      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:

在业务中,我们会涉及到对象的创建、重建、更新、销毁等操作,这些操作通常需要持久化到数据库中,我们通过仓储来实现对数据的访问

1.首先我们要实现仓储上下文,仓储上下文主要是维护一些创建、更新、销毁的对象列表,未来可以实现批量持久化,从而保持多实体与多聚合的事务,从而实现内部一致性和外部一致性:

using Order.Domain.Aggreate;
using Order.Domain.Repository;
using System;
using System.Collections.Generic;
using System.Threading;

namespace Order.Repositories
{
    public abstract class RepositoryContext : IRepositoryContext, IDisposable
    {
        private readonly Guid contextid = Guid.NewGuid();
        private readonly ThreadLocal<Dictionary<Guid, object>> localcreatedics =
            new ThreadLocal<Dictionary<Guid, object>>();
        private readonly ThreadLocal<Dictionary<Guid, object>> localupdatedics =
            new ThreadLocal<Dictionary<Guid, object>>();
        private readonly ThreadLocal<Dictionary<Guid, object>> localremovedics =
    new ThreadLocal<Dictionary<Guid, object>>();
        
        //集合中默认所有内容标记为已提交
        private readonly ThreadLocal<bool> localcommitted = new ThreadLocal<bool>(() => true);
        public bool Committed
        {
            get { return localcommitted.Value; }
            set { localcommitted.Value = value; }
        }

        public Guid ContextId
        {
            get { return contextid; }
        }       

        /// <summary>
        /// 由继承类再实现
        /// </summary>
        public abstract void Commit();
        public abstract void RollBack();
        

        public virtual void Dispose()
        {
            localcreatedics.Dispose();
            localupdatedics.Dispose();
            localremovedics.Dispose();
            localcommitted.Dispose();
        }

        public virtual void RegisterCreate<TAggreateRoot>(TAggreateRoot aggreateroot) where TAggreateRoot : class, IAggreateRoot
        {
            if (aggreateroot.Id.Equals(Guid.Empty))
                throw new ArgumentException("对象ID为空");
            if (localcreatedics.Value.ContainsKey(aggreateroot.Id))
                throw new InvalidOperationException("此对象已在创建集合中");
            localcreatedics.Value.Add(aggreateroot.Id, aggreateroot);
            //创建的对象添加到集合中,并且设置状态为未提交
            localcommitted.Value = false;
        }

        public virtual void RegisterRemove<TAggreateRoot>(TAggreateRoot aggreateroot) where TAggreateRoot:class,IAggreateRoot
        {
            if (aggreateroot.Id.Equals(Guid.Empty))
                throw new ArgumentException("对象ID为空");
            if (localremovedics.Value.ContainsKey(aggreateroot.Id))
                throw new InvalidOperationException("此对象已在删除集合中");
            if (localupdatedics.Value.ContainsKey(aggreateroot.Id))
                throw new InvalidOperationException("此对象正在被修改,不能添加到删除集合中");
            localremovedics.Value.Add(aggreateroot.Id, aggreateroot);
            localcommitted.Value = false;
        }

        public virtual void RegisterUpdate<TAggreateRoot>(TAggreateRoot aggreateroot) where TAggreateRoot:class,IAggreateRoot
        {
            if (aggreateroot.Id.Equals(Guid.Empty))
                throw new ArgumentException("对象ID为空");
            if (localupdatedics.Value.ContainsKey(aggreateroot.Id))
                throw new InvalidOperationException("此对象已在更新集合中");
            if (localremovedics.Value.ContainsKey(aggreateroot.Id))
                throw new InvalidOperationException("此对象正在被删除,不能添加到更新集合中");            
            localupdatedics.Value.Add(aggreateroot.Id, aggreateroot);
            localcommitted.Value = false;
        }
    }
}

因为我们这里最终会使用EF作为对象列表状态维护以及最终提交到持久化存储,所以我们实现一个EF的仓储上下文,使用EF的机制来维护与提交:

using Order.Domain.Model;
using System.Threading;
using System.Data.Entity;


namespace Order.Repositories
{
    public class EFRepositoryContext : RepositoryContext
    {
        private readonly ThreadLocal<OrdersContainer> orderdbcontext =
            new ThreadLocal<OrdersContainer>(() => new OrdersContainer());
       
        public DbContext OrderDbContext { get { return orderdbcontext.Value; } }
        public override void RegisterCreate<TAggreateRoot>(TAggreateRoot aggreateroot)
        {
            orderdbcontext.Value.Set<TAggreateRoot>().Add(aggreateroot);
            Committed = false;
        }
        public override void RegisterUpdate<TAggreateRoot>(TAggreateRoot aggreateroot)
        {
            orderdbcontext.Value.Entry<TAggreateRoot>(aggreateroot).State =
                EntityState.Modified;
            Committed = false;
        }
        public override void RegisterRemove<TAggreateRoot>(TAggreateRoot aggreateroot)
        {
            orderdbcontext.Value.Set<TAggreateRoot>().Remove(aggreateroot);
            Committed = false;
        }
        public override void Commit()
        {
            if (!Committed)
                orderdbcontext.Value.SaveChanges();
            Committed = true;
        }

        public override void RollBack()
        {
            Committed = false;
        }

        public override void Dispose()
        {
            if (!Committed)
                Commit();
            orderdbcontext.Value.Dispose();
            orderdbcontext.Dispose();
            base.Dispose();
        }
    }
}

2.然后我们要实现仓储,仓储主要进行对象的创建、重建、更新和销毁,其中创建、更新和销毁通过仓储上下文实现批量持久化:

using Order.Domain.Aggreate;
using Order.Domain.Repository;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Data;

namespace Order.Repositories
{
    public abstract class EFRepository<TAggreateRoot> : EFRepositoryContext,IRepository<TAggreateRoot>
        where TAggreateRoot:class,IAggreateRoot
    {
        public void Create(TAggreateRoot aggreateroot)
        {
            base.RegisterCreate<TAggreateRoot>(aggreateroot);
        }

        public List<TAggreateRoot> GetbyCondition(Expression<Func<TAggreateRoot, bool>> condition)
        {
            return OrderDbContext.Set<TAggreateRoot>()
                .Where(condition).ToList();
        }

        public TAggreateRoot GetbyId(Guid id)
        {
            return OrderDbContext.Set<TAggreateRoot>().
                Where(p=>p.Id==id).SingleOrDefault();
        }

        public void Remove(TAggreateRoot aggreateroot)
        {
            base.RegisterRemove<TAggreateRoot>(aggreateroot);
        }

        public void RemoveById(Guid id)
        {
            var aggreateroot = OrderDbContext.Set<TAggreateRoot>().
                Where(p => p.Id == id).SingleOrDefault();
            Remove(aggreateroot);
        }
      
        public void Update(TAggreateRoot aggreateroot)
        {
            base.RegisterUpdate<TAggreateRoot>(aggreateroot);
        }
    }
}

 

领域驱动设计案例之仓储顶层实现

标签:

原文地址:http://www.cnblogs.com/malaoko/p/5000211.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!