CQRS学习——一个例子(其六)

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

多图杀猫

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

添加一个功能

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

1.添加Controller

public class BookController : DpfbMvcController
    {
        public ActionResult List(int size = 10, int index = 1)
        {
            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 = 10, int index = 1)
        {
            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", 1) {IsUnique = true})
                .HasMaxLength(100);
        }
    }

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> 

结果测试

收工。

时间: 2024-10-16 19:12:06

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

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

[Dpfb的起名源自:Ddd Project For Beginer,这个Beginer自然就是博主我自己了.请大家在知晓这是一个入门项目的事实上,怀着对入门者表示理解的心情阅读本系列.不胜感激.] 目标 消减自己对DDD的敬畏之心 实践 感受编程的愉悦 技术目标 查询业务分离 无事件溯源 仓储隔离(IOC)等 列表 最小单元的CQRS(Broken+Auditing+Session) 补丁(async以及简单粗暴的异步实现) IoC,Configuration,仓储隔离,以及QueryEntr

Struts2中UI标签之表单标签的一个例子

1.最近写了一篇文章,介绍了一下Struts2中UI标签的表单标签,文章地址为:http://blog.csdn.net/u012561176/article/details/44986183  因为缺少了个例子,大家看文字和表格也看不出什么效果来,所以今天来介绍一个例子,用Struts2中UI标签的表单标签实现一个个人信息的表单,但是有些表单标签没有演示出来,大家可以根据我介绍UI标签的表单标签来进行学习,这里只是给个例子. 2.首先新建一个Struts2项目,项目名为PersonMess

iOS 中 #error宏 的使用的一个例子

头文件中如下定义宏: /** * @brief 默认空间名(必填项) */ #error 必填项 #define DEFAULT_BUCKET @"" /** * @brief 默认表单API功能密钥 (必填项) */ #error 必填项 #define DEFAULT_PASSCODE @"" 类的实现中使用: self.bucket = DEFAULT_BUCKET; self.passcode = DEFAULT_PASSCODE; 这样,如果没有初始化这两

关于如何学习一个框架的经验总结

1.怎么学习一个框架? 我认为有三个维度来说明:这个框架是为了解决什么问题而诞生的?这个框架的核心思想是什么?这个框架适合应用到哪些场景? 说到思想,我觉得编程的灵魂就是思想,没有思想的编程和咸鱼没什么区别,这里我六年来血与泪的总结 2.不要被框架拉着走,要做框架的主人 我发现我身边好多人都深陷于框架之中,包括我自己有一段时间也深陷其中(还好现在走出来了),都关注在这个框架怎么用,哪个牛X,熟不知还没等你熟练怎么用时,又一个新的框架出来,那时你又得学,一来二去你就被框架拉着走了 我觉得当你了解上

一个例子理解threadLocal用法

ThreadLocal可以使对象达到线程隔离的目的.话不多说直接上代码: /** * 一个例子理解threadLocal * * 一个单例模式的类 */ public class SingleThreadLocalTest { private static SingleThreadLocalTest single = new SingleThreadLocalTest(); private ThreadLocal<String> threadLocal = new ThreadLocal<

subsys_initcall宏定义的一个例子,acpi/bus.c里面。

static int __init acpi_init(void) { int result; if (acpi_disabled) { printk(KERN_INFO PREFIX "Interpreter disabled.\n"); return -ENODEV; } acpi_kobj = kobject_create_and_add("acpi", firmware_kobj); if (!acpi_kobj) { printk(KERN_WARNING

js的prototype扩展的一个例子,模仿C#的StringBuilder功能,数组组合字符串,效率大于+拼凑

function StringBuilder() { this._strings_ = new Array;}StringBuilder.prototype.append = function (str) { this._strings_.push(str);};StringBuilder.prototype.toString = function () { return this._strings_.join("");}; js的prototype扩展的一个例子,模仿C#的Strin

javascript闭包的一个例子

<html> <head> <title>elementFromPoint</title> <script type="text/javascript"> window.onload = function(){ for(var i=0; i<6; i++){ var alink = document.createElement('a'); var titleText = document.createTextNode('

线程间共享数据的一个例子

[申明:本文仅限于自我归纳总结和相互交流,有纰漏还望各位指出. 联系邮箱:[email protected]] 题目:输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 题目分析: 一.如果数组中全部为负数,则返回最大负数值即可 二.当既有正数也有负数的时候: (1)从左往右叠加,如果当前叠加值小于或者等于0,则放弃,叠加总和清0(加一个负数或者0是毫无意义的),从此位置继续重新叠加 (