最近一直在看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);
}
}

  

规约模式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. 【转载】借助GitHub托管你的项目代码

    PS:自己关注博客园有2年之久了,不久前才申请注册账号.GitHub也差不多一年多了,因英语水平刚刚及格,所以去GitHub没有博客园多,也是几个月前才注册了账号,前几天休息时看到 EdisonCho ...

  2. URL详解

    浏览器因特网资源:URL是浏览器寻找信息时所需的资源位置,通过URL,应用程序才能找到并使用共享因特网上大量的数据资源. 大部分URL都遵循一种标准的格式: ①HTTP协议(http://或者http ...

  3. (四)SQL Server分区管理

    一.拆分分区(SPLIT) 在已有分区上添加一个新分区. 如下图所示,将分区03拆分成03和04分区,拆分方式先锁定旧03分区的所有数据,后将旧03分区相关数据迁移到分区04,最后删除旧03上的对应分 ...

  4. JSP入门

    JSP简介 所谓JSP就是在网页文件中嵌入Java代码或JSP定义的一些标记.JSP是建立在Servlet上的,在执行时JSP容器会先将JSP文件转换成Servlet文件以及class 文件,然后再执 ...

  5. UIScrollView的缩放原理

    当用户在UIScrollView身上使用捏合手势时,UIScrollView会给代理发送一条消息,询问代理究竟要缩放自己内部的哪一个子控件(哪一块内容) 当用户在UIScrollView身上使用捏合手 ...

  6. Mac Pro 软件安装/个性化配置 汇总

    苹果产品维修 一.Spotlight 搜索程序和文档 Spotlight是最最常用的东西, 类似Windows开始菜单中的搜索.  可以用来搜索文档,也可以搜索本机的程序, 这样可以快速启动. 点击右 ...

  7. 【Alpha版本】 第一天 11.7

    一.站立式会议照片: 二.项目燃尽图: 三.项目进展: 成 员 前段时间完成任务 今天完成任务 明天要做任务 问题困难 心得体会 胡泽善 部分APP功能 我要招聘详情的展示 注册界面的实现 一些特殊效 ...

  8. Extjs 制作柱状图

    在JSP页面制作柱状图,可以根据数据的变化动态实时的变化 主要是使用EXTJS自带的插件达到效果 Ext.require('Ext.chart.*'); Ext.require([ 'Ext.Wind ...

  9. VMware中的Ubuntu网络设置

    网络配置: VMware安装后会有两个默认网卡,分别是VMnet8(192.168.83.1)和VMnet1(192.168.19.1),当然不同的机器上,这两个网卡的 IP会不同的.在windows ...

  10. 瀑布流布局——jquery

    首先确定定位,因为.box的宽度是确定的,根据屏幕的宽度来调整.box的列数,所以#content的宽度是随着.box的列数变化而变化的,并且需要保持相对于body居中. 因此需要给#content添 ...