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

规约(Specification)模式

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

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

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. for (int i = 0; i < 10; i++)
  6. {
  7. OrderInfo o = new OrderInfo()
  8. {
  9. ID = i + 1,
  10. OrderTime = DateTime.Now,
  11. PorductID = new Random().Next(800, 810),
  12. Price = new Random().Next(123, 321),
  13. UserID = i + 1,
  14. UserName = "ZZQ" + i.ToString()
  15. };
  16. SimulateDataBase.Add(o);
  17. }
  18. IRepository<OrderInfo> orderRespository = new OrderRepository();
  19. OrderInfo orderInfo = orderRespository.GetEntity(new OrderInfoSpecification(2));
  20. Console.WriteLine(orderInfo.UserName);
  21. Console.Read();
  22. }
  23. }
  24. public class OrderInfo
  25. {
  26. public int ID { get; set; }
  27. public int UserID { get; set; }
  28. public string UserName { get; set; }
  29. public int PorductID { get; set; }
  30. public decimal Price { get; set; }
  31. public DateTime OrderTime { get; set; }
  32. }
  33. public interface IRepository<TEntity>
  34. where TEntity : class,new()
  35. {
  36. void Add(TEntity entity);
  37. IEnumerable<TEntity> GetEntitys(ISpecification<TEntity> specification);
  38. TEntity GetEntity(ISpecification<TEntity> specification);
  39. }
  40. public interface IOrderRepository : IRepository<OrderInfo>
  41. {
  42.  
  43. }
  44. public class OrderRepository : IOrderRepository
  45. {
  46. public void Add(OrderInfo entity)
  47. {
  48. SimulateDataBase.Add(entity);
  49. }
  50.  
  51. public IEnumerable<OrderInfo> GetEntitys(ISpecification<OrderInfo> specification)
  52. {
  53. return SimulateDataBase.OrderInfoList.Where(specification.IsSatisfiedBy);
  54. }
  55.  
  56. public OrderInfo GetEntity(ISpecification<OrderInfo> specification)
  57. {
  58. return SimulateDataBase.OrderInfoList.Where(specification.IsSatisfiedBy).FirstOrDefault();
  59. }
  60. }
  61.  
  62. public interface ISpecification<TEntity>
  63. {
  64. bool IsSatisfiedBy(TEntity obj);
  65. //ISpecification<TEntity> And(ISpecification<TEntity> other);
  66. //ISpecification<TEntity> Or(ISpecification<TEntity> other);
  67. //ISpecification<TEntity> AndNot(ISpecification<TEntity> other);
  68. //ISpecification<TEntity> Not();
  69. Expression<Func<TEntity, bool>> GetExpression();
  70. }
  71. public abstract class Specification<TEntity> : ISpecification<TEntity>
  72. {
  73. public bool IsSatisfiedBy(TEntity obj)
  74. {
  75. return this.GetExpression().Compile()(obj);
  76. }
  77. public abstract Expression<Func<TEntity, bool>> GetExpression();
  78. }
  79. public class OrderInfoSpecification : Specification<OrderInfo>
  80. {
  81. //private readonly OrderInfo order;
  82. //public OrderInfoSpecification(OrderInfo order)
  83. //{
  84. // this.order = order;
  85. //}
  86. private readonly int userId;
  87. public OrderInfoSpecification(int userId)
  88. {
  89. this.userId = userId;
  90. }
  91. public override Expression<Func<OrderInfo, bool>> GetExpression()
  92. {
  93. return x => x.UserID == userId;
  94. }
  95. }
  96. public static class SimulateDataBase
  97. {
  98. private static List<OrderInfo> orderInfoList = new List<OrderInfo>();
  99.  
  100. public static IList<OrderInfo> OrderInfoList
  101. {
  102. get { return orderInfoList; }
  103. }
  104.  
  105. public static void Add(OrderInfo order)
  106. {
  107. orderInfoList.Add(order);
  108. }
  109. }

  

规约模式Specification的学习的更多相关文章

  1. 规约模式(Specification Pattern)

    前期准备之规约模式(Specification Pattern) 一.前言 在专题二中已经应用DDD和SOA的思想简单构建了一个网上书店的网站,接下来的专题中将会对该网站补充更多的DDD的内容.本专题 ...

  2. [.NET领域驱动设计实战系列]专题三:前期准备之规约模式(Specification Pattern)

    一.前言 在专题二中已经应用DDD和SOA的思想简单构建了一个网上书店的网站,接下来的专题中将会对该网站补充更多的DDD的内容.本专题作为一个准备专题,因为在后面一个专题中将会网上书店中的仓储实现引入 ...

  3. 规约模式Specification Pattern

    什么是规约模式 规约模式允许我们将一小块领域知识封装到一个单元中,即规约,然后可以在code base中对其进行复用. 它可以用来解决在查询中泛滥着GetBySomething方法的问题,以及对查询条 ...

  4. 规约模式(Specification Pattern)

    一.引言 最近在看一个项目的源码时(DDD),对里面的一些设计思想和设计思路有了一些疑问.当看到(Repository层)中使用了 spec.SatisfiedBy() 时,感觉有点懵.于是在项目中搜 ...

  5. step_by_step_ABP规约模式

    一段时间没有在github 上浏览ABP项目,几天前看到ABP新增规约模式,开始了解并学习文档   记录一下 Introduction 介绍 Specification pattern is a pa ...

  6. 设计模式:规约模式(Specification-Pattern)

    "其实地上本没有路,走的人多了,也便成了路"--鲁迅<故乡> 这句话很好的描述了设计模式的由来.前辈们通过实践和总结,将优秀的编程思想沉淀成设计模式,为开发者提供了解决 ...

  7. 生产环境下实践DDD中的规约模式

    最近的开发工作涉及到两个模块“任务”和“日周报”.关系是日周报消费任务,因为用户在写日周报的时候,需要按一定的规则筛选当前用户的任务,作为日周报的一部分提交.整个项目采用类似于Orchard那种平台加 ...

  8. [.NET领域驱动设计实战系列]专题五:网上书店规约模式、工作单元模式的引入以及购物车的实现

    一.前言 在前面2篇博文中,我分别介绍了规约模式和工作单元模式,有了前面2篇博文的铺垫之后,下面就具体看看如何把这两种模式引入到之前的网上书店案例里. 二.规约模式的引入 在第三专题我们已经详细介绍了 ...

  9. DDD~领域服务的规约模式

    回到目录 规 约(Specification)模式:第一次看到这东西是在microsoft NLayer项目中,它是微软对DDD的解说,就像petshop告诉了我们MVC如何使用一样,这个规约模式最重 ...

随机推荐

  1. DD_belatedPNG.js解决透明PNG图片背景灰色问题

    <!--[]> <script type="text/javascript" src="http://www.phpddt.com/usr/themes ...

  2. ubuntu常用命令

    <一> 安装文件 一.deb包的安装方式 sudo dpkg -i *.deb 二.编译安装方式 建立编译环境sudo apt-get install build-essential 到源 ...

  3. java8--类加载机制与反射(java疯狂讲义3复习笔记)

    本章重点介绍java.lang.reflect包下的接口和类 当程序使用某个类时,如果该类还没有被加载到内存中,那么系统会通过加载,连接,初始化三个步骤来对该类进行初始化. 类的加载时指将类的clas ...

  4. 今天又学了一招,牛逼!!!解决"-bash:No such file or directory"问题

    今天在64服务器上:发现好像bash 坏了,用户名前边   用-bash 显示,,前几天就发现这个问题,,,但是当时忙没有解决,,,,,今天来看看到底是怎么回事! File Exists but... ...

  5. 脑筋急转弯——Google 面试

    1. 村子里有100对夫妻,其中每个丈夫都瞒着自己的妻子偷情...村里的每个妻子都能立即发现除自己丈夫之外的其他男人是否偷情,唯独不知道她自己的丈夫到底有没有偷情.村里的规矩不容忍通奸.任何一个妻子, ...

  6. noip2015 运输计划

    描述 公元 2044 年,人类进入了宇宙纪元.L 国有 nn 个星球,还有 n−1n−1 条双向航道,每条航道建立在两个星球之间,这 n−1n−1 条 航道连通了 L 国的所有星球. 小 P 掌管一家 ...

  7. PHP使用数组依次替换字符串中匹配项

    select * from table where ctime >= '[date-14]' and ctime <= '[date-1]'; 想把上面这句sql的中括号表示的日期依次换成 ...

  8. Android 双击 Back 键退出程序

    双击退出程序的原理无非就是设置一个退出标识(询问是否退出),如果改变了这个标识(确认退出),则再次点击时立马退出,如果短时间内没有退出,则延时重置这个标识(不退出). ================ ...

  9. Linux Swap分区设定

    因为准备在linux上面安装Oracle数据库,据说swap分区小于4G容易失败,天啦噜的我连swap分区是啥都不是非常清楚, 大概有个印象吧,但先搞大了再说. 测试证明Ubuntu14默认的swap ...

  10. twemproxy explore,redis和memcache代理服务器

    twemproxy,也叫nutcraker.是一个twtter开源的一个redis和memcache代理服务器. redis作为一个高效的缓存服务器,非常具有应用价值.但是当使用比较多的时候,就希望可 ...