规约模式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);
}
}
规约模式Specification的学习的更多相关文章
- 规约模式(Specification Pattern)
前期准备之规约模式(Specification Pattern) 一.前言 在专题二中已经应用DDD和SOA的思想简单构建了一个网上书店的网站,接下来的专题中将会对该网站补充更多的DDD的内容.本专题 ...
- [.NET领域驱动设计实战系列]专题三:前期准备之规约模式(Specification Pattern)
一.前言 在专题二中已经应用DDD和SOA的思想简单构建了一个网上书店的网站,接下来的专题中将会对该网站补充更多的DDD的内容.本专题作为一个准备专题,因为在后面一个专题中将会网上书店中的仓储实现引入 ...
- 规约模式Specification Pattern
什么是规约模式 规约模式允许我们将一小块领域知识封装到一个单元中,即规约,然后可以在code base中对其进行复用. 它可以用来解决在查询中泛滥着GetBySomething方法的问题,以及对查询条 ...
- 规约模式(Specification Pattern)
一.引言 最近在看一个项目的源码时(DDD),对里面的一些设计思想和设计思路有了一些疑问.当看到(Repository层)中使用了 spec.SatisfiedBy() 时,感觉有点懵.于是在项目中搜 ...
- step_by_step_ABP规约模式
一段时间没有在github 上浏览ABP项目,几天前看到ABP新增规约模式,开始了解并学习文档 记录一下 Introduction 介绍 Specification pattern is a pa ...
- 设计模式:规约模式(Specification-Pattern)
"其实地上本没有路,走的人多了,也便成了路"--鲁迅<故乡> 这句话很好的描述了设计模式的由来.前辈们通过实践和总结,将优秀的编程思想沉淀成设计模式,为开发者提供了解决 ...
- 生产环境下实践DDD中的规约模式
最近的开发工作涉及到两个模块“任务”和“日周报”.关系是日周报消费任务,因为用户在写日周报的时候,需要按一定的规则筛选当前用户的任务,作为日周报的一部分提交.整个项目采用类似于Orchard那种平台加 ...
- [.NET领域驱动设计实战系列]专题五:网上书店规约模式、工作单元模式的引入以及购物车的实现
一.前言 在前面2篇博文中,我分别介绍了规约模式和工作单元模式,有了前面2篇博文的铺垫之后,下面就具体看看如何把这两种模式引入到之前的网上书店案例里. 二.规约模式的引入 在第三专题我们已经详细介绍了 ...
- DDD~领域服务的规约模式
回到目录 规 约(Specification)模式:第一次看到这东西是在microsoft NLayer项目中,它是微软对DDD的解说,就像petshop告诉了我们MVC如何使用一样,这个规约模式最重 ...
随机推荐
- Sybase 出错解决步骤
总结: 1.出错该错误可以先检查一下Sybase BCKServer服务有没有启动 2.在dsedit看能否ping通备份服务 3.检查master库sysservers表的配置 4.如在备份数据库d ...
- 数据存储_SQLite (2)
SQL代码应用示例 一.使用代码的方式批量添加(导入)数据到数据库中 在ios项目中使用代码批量添加多行数据示例 代码示例: 1 // 2 // main.m 3 // 01-为数据库添加多行数据 4 ...
- Npoi导入导出Excel操作
之前公司的一个物流商系统需要实现对订单的批量导入和导出,翻阅了一些资料,最后考虑使用NPOI实现这个需求. 在winform上面实现excel操作:http://www.cnblogs.com/Cal ...
- [Head First设计模式]生活中学设计模式——迭代器模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- 移动端框架篇-控制子容器的滑屏框架-fullPage.js
控制子容器法 方法是只显示其中一个子元素,其它隐藏,滑屏时隐藏当前元素,并显示当前元素的下一个同辈元素~ 这里采用fullPage框架,库大小7.69K~ fullPage框架的页面样式无需自定义,已 ...
- NOIP2012同余方程
描述 求关于 x的同余方程 ax ≡ 1(mod b) 的最小正整数解. 输入格式 输入文件 mod.in输入只有一行,包含两个正整数a,b,用一个空格隔开. 输出格式 输出文件 为 modmod ...
- jQuery入门(1)jQuery中万能的选择器
jQuery入门(1)jQuery中万能的选择器 jQuery入门(2)使用jQuery操作元素的属性与样式 jQuery入门(3)事件与事件对象 jQuery入门(4)jQuery中的Ajax()应 ...
- PhpStorm 2016.3 For Mac 重大里程碑更新 -- 终于解决了不能输入中文标点符号的重大bug
PhpStorm 2016.3 For Mac 重大里程碑更新 1.[终于解决了]不能输入中文标点符号的重大bug,如 逗号“,”.“.”: 2.可以在一个窗体中,同时打开多个项目: 3.其他... ...
- 第3月第9天 循环引用 block
一.一个对象没有被引用,那么在函数块完成时就会被dealloc,这种情况因为对象销毁了,block块也永远不会执行. MyNetworkOperation *op = [[MyNetworkOpera ...
- "转" CXF+JAXB处理复杂数据
CXF简单数据类型以及类(JavaBean)都提供了较好的支持. 但是对于一些复杂类型(集合或者Map的嵌套)的处理时,就需要我们进行“”人工干预“.在网上找了一些文章,其中这篇写的最为详细,再次备注 ...