zoukankan      html  css  js  c++  java
  • 规约模式Specification的学习

    最近一直在看DDD开发  规约似乎用得很普遍。 但是还是理解不了。所以记录下学习的进度。~

    规约(Specification)模式 

    目的:查询语句和查询条件的分离

    写了一个关于规约的模拟小程序

     class Program
        {
            static void Main(string[] args)
            {
                for (int i = 0; i < 10; i++)
                {
                    OrderInfo o = new OrderInfo()
                    {
                        ID = i + 1,
                        OrderTime = DateTime.Now,
                        PorductID = new Random().Next(800, 810),
                        Price = new Random().Next(123, 321),
                        UserID = i + 1,
                        UserName = "ZZQ" + i.ToString()
                    };
                    SimulateDataBase.Add(o);
                }
                IRepository<OrderInfo> orderRespository = new OrderRepository();
                OrderInfo orderInfo = orderRespository.GetEntity(new OrderInfoSpecification(2));
                Console.WriteLine(orderInfo.UserName);
                Console.Read();
            }
        }
        public class OrderInfo
        {
            public int ID { get; set; }
            public int UserID { get; set; }
            public string UserName { get; set; }
            public int PorductID { get; set; }
            public decimal Price { get; set; }
            public DateTime OrderTime { get; set; }
        }
        public interface IRepository<TEntity>
            where TEntity : class,new()
        {
            void Add(TEntity entity);
            IEnumerable<TEntity> GetEntitys(ISpecification<TEntity> specification);
            TEntity GetEntity(ISpecification<TEntity> specification);
        }
        public interface IOrderRepository : IRepository<OrderInfo>
        {
    
        }
        public class OrderRepository : IOrderRepository
        {
            public void Add(OrderInfo entity)
            {
                SimulateDataBase.Add(entity);
            }
    
            public IEnumerable<OrderInfo> GetEntitys(ISpecification<OrderInfo> specification)
            {
                return SimulateDataBase.OrderInfoList.Where(specification.IsSatisfiedBy);
            }
    
            public OrderInfo GetEntity(ISpecification<OrderInfo> specification)
            {
                return SimulateDataBase.OrderInfoList.Where(specification.IsSatisfiedBy).FirstOrDefault();
            }
        }
    
        public interface ISpecification<TEntity>
        {
            bool IsSatisfiedBy(TEntity obj);
            //ISpecification<TEntity> And(ISpecification<TEntity> other);
            //ISpecification<TEntity> Or(ISpecification<TEntity> other);
            //ISpecification<TEntity> AndNot(ISpecification<TEntity> other);
            //ISpecification<TEntity> Not();
            Expression<Func<TEntity, bool>> GetExpression();
        }
        public abstract class Specification<TEntity> : ISpecification<TEntity>
        {
            public bool IsSatisfiedBy(TEntity obj)
            {
                return this.GetExpression().Compile()(obj);
            }
            public abstract Expression<Func<TEntity, bool>> GetExpression();
        }
        public class OrderInfoSpecification : Specification<OrderInfo>
        {
            //private readonly OrderInfo order;
            //public OrderInfoSpecification(OrderInfo order)
            //{
            //    this.order = order;
            //}
            private readonly int userId;
            public OrderInfoSpecification(int userId)
            {
                this.userId = userId;
            }
            public override Expression<Func<OrderInfo, bool>> GetExpression()
            {
                return x => x.UserID == userId;
            }
        }
        public static class SimulateDataBase
        {
            private static List<OrderInfo> orderInfoList = new List<OrderInfo>();
    
            public static IList<OrderInfo> OrderInfoList
            {
                get { return orderInfoList; }
            }
    
            public static void Add(OrderInfo order)
            {
                orderInfoList.Add(order);
            }
        }
    

      

  • 相关阅读:
    大神的文章
    分布式锁
    分布式事务
    事务两三事
    spring框架笔记
    三个缓存数据库Redis、Memcache、MongoDB
    面向对象面试题
    SSM面试
    单例模式
    Spring Cloud面试题
  • 原文地址:https://www.cnblogs.com/since87/p/3545211.html
Copyright © 2011-2022 走看看