备注

之前把DCI的Role和四色原型的Role给弄混了,本文也不会比较这两种Role的区别(后面有机会再说),这里简单的记录一下对DCI的理解。

参考文章:http://www.cnblogs.com/happyframework/p/3302238.html

什么是DCI?

Context 选择 Data,让 Data  扮演 Role 执行 Interaction。

Data

用户模型(只包含数据和本地方法)。

如:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace DCIStudy.V7
{
public partial class People
{
public string Name { get; set; } public TRole Act<TRole>()
where TRole : class
{
return this as TRole;
}
}
}

Context

面向用例设设计,职责为:选择对象,让对象扮演角色,让角色执行交互。

如:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace DCIStudy.V7.Company
{
public class CompanyContext
{
public void Execute()
{
//选择对象。
var steven = new People { Name = "Steven" }; //扮演角色。
var developer = steven.Act<IDeveloper>(); //执行交互。
developer.Coding();
}
}
}

Interaction

角色的行为驱动用例的执行。

如:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; using DCIStudy.V7.Company; namespace DCIStudy.V7
{
public partial class People : IDeveloper
{
void IDeveloper.Coding()
{
Console.WriteLine(string.Format("{0},快乐的编程中!",this.Name));
}
}
}

如何将Role注入到Data中?

开发期注入

字节码增强

下文的语法是AspectJ吗?我没有验证,有懂的朋友给我留言,我感觉字节码增强是可以实现的。

Mixin

http://www.cnblogs.com/happyframework/archive/2013/04/25/3040461.html

Trait

Trait本质上是一种Mixin的实现,Scala和Php5.4在语法级别支持了trait。

http://php.net/manual/en/language.oop5.traits.php

Template

http://www.cnblogs.com/stephen-liu74/archive/2012/08/12/2635583.html

T4 + 部分类 + 显式接口实现 + 扩展类型,C#专用

后面会给出示例,因为T4 + 扩展类型都是为了复用的,后文只给出显示接口实现 + 部分类的代码,如果有复用需求,可以引入T4 + 扩展类型。

运行期注入

Mixin

Mixin也分开发期间Mixin和运行期间Mixin。

凡是支持OpenClass的语言都支持运行期间Mixin,如:Ruby、Python和Javascript。OpenClass的本质是运行期间可以修改类型系统,也叫“动态类型”,像Php这种静态类型语言就没有这个特性,虽然Php是弱类型和解释执行的。

http://www.cnblogs.com/happyframework/archive/2013/04/25/3040461.html(重点看Ruby)。

动态代理

http://www.cnblogs.com/happyframework/p/3295853.html

http://qi4j.org/

为什么要用DCI?

如果将DCI作为一种编程模式或设计模式的话,我是比较认可的,作为一种架构模式,还有待考量,等有机会用一下再做评价。

DCI在C#种的两种实现

第一种:显式接口实现 + 部分类

项目结构

代码(给出一个上下文的代码)

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace DCIStudy.V7.Home
{
public class HomeContext
{
public void Execute()
{
//选择对象。
var steven = new People { Name = "Steven" }; //扮演角色。
var player = steven.Act<IPlayer>(); //执行交互。
player.Play();
}
}
} using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace DCIStudy.V7.Home
{
public interface IPlayer
{
void Play();
}
} using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; using DCIStudy.V7.Home; namespace DCIStudy.V7
{
public partial class People : IPlayer
{
void IPlayer.Play()
{
Console.WriteLine(string.Format("{0},疯狂的游戏中!",this.Name));
}
}
} using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace DCIStudy.V7
{
public partial class People
{
public string Name { get; set; } public TRole Act<TRole>()
where TRole : class
{
return this as TRole;
}
}
}

第二种实现:组合

项目结构

代码(给出一个上下文的代码)

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace DCIStudy.V8.Company
{
public class CompanyContext
{
public void Execute()
{
//选择对象。
var steven = new People { Name = "Steven" }; //扮演角色。
var developer = steven.Act<Developer>(); //执行交互。
developer.Coding();
}
}
} using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace DCIStudy.V8.Company
{
public class CompanyContext
{
public void Execute()
{
//选择对象。
var steven = new People { Name = "Steven" }; //扮演角色。
var developer = steven.Act<Developer>(); //执行交互。
developer.Coding();
}
}
} using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace DCIStudy.V8
{
public class People
{
public string Name { get; set; } public TRole Act<TRole>()
where TRole : class
{
var role = Activator.CreateInstance<TRole>(); (role as dynamic).People = this; return role;
}
}
}

备注

相对于DDD,DCI给出的模式显得过于泛化了,如:分层、分区(BondedContext)、每个层有哪些元素、如何交互等,DCI、四色原型和DDD应该可以以某种形式融合,有待慢慢思考。

最新文章

  1. Dubbo
  2. .NET 微信Token验证和消息接收和回复
  3. 【2016-10-13】【坚持学习】【Day4】【WPF】【ObservableCollection&lt;T&gt;】
  4. asp.net使用signalr实现集群集群下面的消息推送
  5. iOS数组使用
  6. Java 并发同步器之CountDownLatch、CyclicBarrier
  7. nginx添加nginx_mod_h264_streaming-2.2.7模块编译报错
  8. Tableau
  9. html系列教程--DOCTYPE a area
  10. 基于NetMQ的TLS框架NetMQ.Security的实现分析
  11. Linux程序宕掉后如何通过gdb查看出错信息
  12. 在利用node连接数据库遇到的问题
  13. POJ 3579 Median 【二分答案】
  14. 【HBase调优】Hbase万亿级存储性能优化总结
  15. Intellij Idea修改css文件即时更新生成效果
  16. c#task list waitall task waitany
  17. 【uoj#48】[UR #3]核聚变反应强度 数论
  18. STL容器:list双向链表学习
  19. 开始创建一个 Vue 项目
  20. webservice-之使用axis+spring开发

热门文章

  1. java并发编程实战笔记---(第二章)线程安全:正确性
  2. Python库导入错误:ImportError: No module named matplotlib.pyplot
  3. 第七章 用户输入和while语句
  4. Python 的十个自然语言处理工具
  5. Codeforces Round #302 (Div. 1) B - Destroying Roads
  6. python元类:type和metaclass
  7. ACID数据库事务正确执行的四个基本要素的缩写
  8. Linux下安装scapy-python3
  9. python语言特性总结
  10. POJ 1222【异或高斯消元|二进制状态枚举】