.net 的动态语言实现DCI架构模式的角色混入

来源:互联网 发布:ios数据存储方式 编辑:程序博客网 时间:2024/05/01 02:34

DCI机构模式实现很重要的一个特性就是同一个PPT在不同context中的Role混入。

若采用Scala可以很好的支持此特性。

C#是否也可以支持此特性吗?

答案当然是肯定的。那就是采用.net 4.0 dynamic

 

我们看下面这个例子

在家时候,老公和老婆是父母角色,具有洗菜做饭的职责。

在单位时候,老公是售前支持角色,对外宣讲公司产品,老婆是室内设计师,进行公司室内装修设计

void Main(){List<People> peoples = new List<People>(){new People(PeopleName.老婆.ToString()),new People(PeopleName.老公.ToString())};List<Role> roles = new List<Role>(){new Chef(),new Assitant(),new SaleSupporter(),new DrawDesigner()};Console.WriteLine("---------------在家场景---------------");AtHomeContext home = new AtHomeContext();home.Intial(peoples,roles);home.AssignRole();home.Cook("白菜");Console.WriteLine("---------------上班场景---------------");InOfficeContext office = new InOfficeContext();office.Intial(peoples,roles);office.AssignRole();office.DoWork();}

 

执行结果如下:

---------------在家场景---------------
老公在家洗白菜
老婆在家炒白菜
---------------上班场景---------------
老公在单位编写公司新产品幻灯片,客户那里宣讲公司新产品的幻灯片
老婆在单位进行2居室地中海风格的室内设计

 

场景类

public abstract class Context{public List<People> peoples {get;private set;}public List<Role> roles {get;private set;}public void Intial(List<People> peoples,List<Role> roles){this.peoples = peoples;this.roles = roles;}public abstract void AssignRole();}public class InOfficeContext:Context{People 老婆 , 老公;Role supporter,designer;public override void AssignRole(){老婆 = peoples.Where(p => p.Name == PeopleName.老婆.ToString()).FirstOrDefault();老公 = peoples.Where(p => p.Name == PeopleName.老公.ToString()).FirstOrDefault();supporter = roles.Where(r => r.GetRole == RoleType.SaleSupporter).FirstOrDefault();designer = roles.Where(r => r.GetRole == RoleType.DrawDesigner).FirstOrDefault();老婆.Role = designer;designer.People = 老婆;老公.Role = supporter;supporter.People = 老公;}public void DoWork(){老公.Role.PearchProductPPT("公司新产品");  老婆.Role.Draw("2居室地中海风格");        }}public class AtHomeContext:Context{People 老婆 , 老公;Role chef,assitant;public override void AssignRole(){老婆 = peoples.Where(p => p.Name == PeopleName.老婆.ToString()).FirstOrDefault();老公 = peoples.Where(p => p.Name == PeopleName.老公.ToString()).FirstOrDefault();chef = roles.Where(r => r.GetRole == RoleType.Chef).FirstOrDefault();assitant = roles.Where(r => r.GetRole == RoleType.Assitant).FirstOrDefault();老婆.Role = chef;chef.People = 老婆;老公.Role = assitant;assitant.People = 老公;}public void Cook(string food){老公.Role.WashFood(food);老婆.Role.Cook(food);}}


PPT类

public class People{public People(string name){Name = name;}public string Name {get;private set;}public dynamic Role {get;set;}}public enum PeopleName{老婆,老公}


 

角色类

public abstract class Role{public People People{protected get;set;}public abstract RoleType GetRole{get;}}public class Chef:Role{public void Cook(string food){Console.WriteLine(base.People.Name + "在家炒" + food);}public override RoleType GetRole{get{return RoleType.Chef;}}}public class Assitant:Role{public void WashFood(string food){Console.WriteLine(base.People.Name + "在家洗" + food);}public override RoleType GetRole{get{return RoleType.Assitant;}}}public class SaleSupporter:Role{public void PearchProductPPT(string product){Console.WriteLine(base.People.Name + "在单位编写" + product + "幻灯片,客户那里宣讲" + product + "的幻灯片"); }public override RoleType GetRole{get{return RoleType.SaleSupporter;}}}public class DrawDesigner:Role{public void Draw(string product){Console.WriteLine(base.People.Name + "在单位进行" + product + "的室内设计");}public override RoleType GetRole{get{return RoleType.DrawDesigner;}}}public enum RoleType{Chef,Assitant,SaleSupporter,DrawDesigner}