【先上链接:http://pan.baidu.com/s/1o62AHbc 】

多图杀猫

先用一组图看看实现的功能:

添加一个功能

假定现在要添加一个书本录入的功能,那么执行如下的操作:

1.添加Controller

public class BookController : DpfbMvcController
{
public ActionResult List(int size = , int index = )
{
throw new NotImplementedException();
} [Authorize]
public ActionResult Add()
{
return View();
} [Authorize]
[HttpPost]
public ActionResult Add(BookAddViewModel model)
{
throw new NotImplementedException();
}
}

2.定义Book模型,command,查询入口,仓储和实现commandHandler
//book

namespace SI.Cqrs.Models.AggreateRoots
{
public class Book : AggregateRoot
{
public string Name { get; set; }
public decimal Price { get; set; }
}
}

//QueryEntry

public interface IBookQueryEntry : IQueryEntry<Book>
{ }

//Reponsitory

 public interface IBookReponsitory:IBasicReponsitory<Book>
{ }

//handler,至于command,这里偷个懒,用泛型类解决

 public class BookHandler:ICommandHandler<DpfbItemInsertCommand<Book>>
{
[Dependency]
internal IBookReponsitory BookReponsitory { get; set; } void ICommandHandler<DpfbItemInsertCommand<Book>>.Execute(DpfbItemInsertCommand<Book> command)
{
BookReponsitory.Insert(command.AggregateRoot);
}
}

3.回过头来完成controller未实现的方法

public class BookController : DpfbMvcController
{
[Dependency]
internal IBookQueryEntry BookQueryEntry { get; set; } public ActionResult List(int size = , int index = )
{
var pageInfo = new PageInfo(size, index);
var result = BookQueryEntry.Page(i => i.Name, pageInfo);
return View(result);
} [Authorize]
public ActionResult Add()
{
return View();
} [Authorize]
[HttpPost]
public ActionResult Add(BookAddViewModel model)
{
var book = new Book {Name = model.Name, Price = model.Price};
var command = new DpfbItemInsertCommand<Book> {AggregateRoot = book};
CommandBus.Send(command);
return Redirect("List");
}
}

4.实现Storage
//Reponsitory

public class BookReponsitory : SoftDeleteEntityFrameworkReponsitory<Book>, IBookReponsitory
{ }

//QueryEntry

public class BookQueryEntry : ReponsitoryBasedQueryEntry<Book>, IBookQueryEntry
{
public override IBasicReponsitory<Book> BasicReponsitory
{
get { return BookReponsitory; }
} [Dependency]
internal IBookReponsitory BookReponsitory { get; set; }
}

5.同步数据库定义
//定义并添加一个Map

public class BookMap:TableMap<Book>
{
public BookMap()
{
/*为Name创建唯一索引*/
Property(i => i.Name).IsRequired()
.HasColumnAnnotation(IndexAnnotation.AnnotationName,
new IndexAttribute("IU_UserName", ) {IsUnique = true})
.HasMaxLength();
}
} public class SocialInsuranceContext : DbContext
{
public SocialInsuranceContext()
: base("name=SocialInsuranceContext")
{ } public DbSet<User> Users { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Configurations.Add(new UserMap());
modelBuilder.Configurations.Add(new BookMap());
}
}

//更新数据库定义

PM> Add-Migration Initial_Database
Scaffolding migration 'Initial_Database'.
The Designer Code for this migration file includes a snapshot of your current Code First model. This snapshot is used to calculate the changes to your model when you scaffold the next migration. If you make additional changes to your model that you want to include in this migration, then you can re-scaffold it by running 'Add-Migration Initial_Database' again.
PM> Update-Database
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Applying explicit migrations: [201510300844286_Initial_Database].
Applying explicit migration: 201510300844286_Initial_Database.
Running Seed method.
PM>

结果测试

收工。

CQRS学习——一个例子(其六)的更多相关文章

  1. 从一个例子学习 instanceof 和 getclass 的区别

    判断两个对象是否为同一类型,时常用到getclass 和 instanceof ,而这两个函数又是时常让人混淆.下面从一个例子说明两者的区别: public class Test_drive { pu ...

  2. CQRS学习——IOC,配置,仓储隔离以及QueryEntry[其三]

    从IoC开始说起 博主最早开始用的IoC容器叫AutoFac,那时候用它主要是为了生命周期管理——将EF上下文的生命周期限定为每请求.当然也总是每每听到IoC的好处,但是仍然不能理解其优势.最近在学习 ...

  3. php部分--面向对象三大特性-封装(另加连续调用的一个例子)、继承(重写、重载的例子)、多态;

    一.封装性: 目的:为了使类更加安全. 做法:1设置私有成员 2在类中建方法,访问私有成员 3在方法里边加控制(if) 私有成员访问的两种方法: 方法一:set(可写) get(可读)做方法(可读可写 ...

  4. CQRS学习——Dpfb以及其他[引]

    [Dpfb的起名源自:Ddd Project For Beginer,这个Beginer自然就是博主我自己了.请大家在知晓这是一个入门项目的事实上,怀着对入门者表示理解的心情阅读本系列.不胜感激.] ...

  5. Webpack入门——使用Webpack打包Angular项目的一个例子

    2016.1.22,对大多数人来说,这是一个非常平常的日子,但这却是我决定在博客园写博客的日子.虽然注册博客园的博客已有4年8个月,却一直没有动手写过一篇博客,原因是觉得自己水平不行,写不出好东西,所 ...

  6. Javascript 进阶 面向对象编程 继承的一个例子

    Javascript的难点就是面向对象编程,上一篇介绍了Javascript的两种继承方式:Javascript 进阶 继承,这篇使用一个例子来展示js如何面向对象编程,以及如何基于类实现继承. 1. ...

  7. [0406]学习一个——Unit 1 Html、CSS与版本控制

    前言 最近发现了Github的Student认证,本来想用来注册Digital Ocean搭个梯子,结果注册验证不能用VISA借记卡=~=. 那么在这漫长的清明节假期里,只有学习能满足空虚的内心(划掉 ...

  8. 通过一个例子了解Ajax

    Ajax指的Asyncronous JavaScript and XML Ajax并不是什么新的编程语言, 它是现有一些东西的应用.从它的名称中就可以看出来 假如我们设想, 浏览器展示了一个页面,但需 ...

  9. 《The art of software testing》的一个例子

    这几天一直在看一本书,<The art of software testing>,里面有一个例子挺有感触地,写出来和大家分享一下: [问题] 从输入对话框中读取三个整数值,这三个整数值代表 ...

随机推荐

  1. HTTP - 条件请求

    当 HTTP 请求包含 If-XXX 这种样式的首部时,服务器会对附带的条件进行判断,只有判断指定条件为真,才会执行请求.这样的请求首部有五个,分别是 If-Modified-Since.If-Unm ...

  2. JAVA之Switch语句

    switch case语句是用来判断case后面的表达式是否与switch的表达式一致,符合的话就执行case语句,不符合则break跳出.而default是当没有符合case的条件下执行的(它不用b ...

  3. C# DateTimePicker控件详解

    1.同时显示日期和时间 DateTimePicker dtp = new DateTimePicker(); dtp.Format = DateTimePickerFormat.Custom;dtp. ...

  4. (转)DES、RSA、MD5、SHA、随机生成加密与解密

    一.数据加密/编码算法列表   常见用于保证安全的加密或编码算法如下:   1.常用密钥算法   密钥算法用来对敏感数据.摘要.签名等信息进行加密,常用的密钥算法包括:   DES(Data Encr ...

  5. angular的post请求,SpringMVC后台接收不到参数值的解决方案

    这是我后台SpringMVC控制器接收isform参数的方法,只是简单的打出它的值: @RequestMapping(method = RequestMethod.POST) @ResponseBod ...

  6. echarts标准饼图(二)——标题(title)配置

    标题(title)配置 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  7. Php 数据类型

    数据类型 JS中二大类 基本数据类型 number string boolean undefined null 复合数据类型 array object function php数据类型分为三大类 标量 ...

  8. linux之Gcc使用

    本篇文章摘自 http://blog.csdn.net/ljzcom/article/details/7213101 对于Gcc自带的很多命令行,只有具体编程里面用到了或者看到别人真真用到的,用的目的 ...

  9. 使用DNSSCrypt解决DNS污染问题

    本文转自 月光博客,如有需要,请阅读原文. google近期在国内是不能访问了,dropbox这货居然也被DNS污染了,幸好发现DNSCrypt这一神器,防止DNS污染的绝佳工具. 基本原理:DNSC ...

  10. bzoj 1040 骑士

    这题真不爽,各种WA,写个题解浏览器还挂了,真不爽. 所以不多说了,就说关于判断是否是父节点的问题,不能直接判,会有重边,这种情况只能用编号判,传进去入边的编号,(k^1) != fa,这样就可以了. ...