实现超市的结算系统:

计算相应的优惠方式的接口

 public interface ICompute
{
double GetResultTotalMoney(double TotalMoney);
}

打折的算法类:

 public class DisCount : ICompute
{
private double discount;
public DisCount(double discount)
{
this.discount = discount;
} public double GetResultTotalMoney(double TotalMoney)
{
return TotalMoney *discount;
}
}

买多少送多少的类:

  public class ReturnBack : ICompute
{
private double musttotalmoney;
private double returnmoney;
public ReturnBack(double musttotalmoney,double returnmoney)
{
this.musttotalmoney = musttotalmoney;
this.returnmoney = returnmoney;
}
public double GetResultTotalMoney(double TotalMoney)
{
return TotalMoney - (TotalMoney / musttotalmoney) * returnmoney;
}
}

购买的业务逻辑:

 public class BuyBusinessService
{
ICompute icompute;
public double GetReturnMoney(string type,double totalmoney)
{
switch(type)
{
case "打三折":
icompute = new DisCount(0.3);
break;
case "满300送100":
icompute = new ReturnBack(300, 100);
break;
default:
icompute = new DisCount(1);
break;
} return getreturnbacktotalmoney(totalmoney);
} private double getreturnbacktotalmoney(double totalmoney)
{
return icompute.GetResultTotalMoney(totalmoney);
}
}

利用工作流的实现:(新建活动)

新建代码活动:MustReturnActivity

 public sealed class MustReturnActivity : CodeActivity
{
// 定义一个字符串类型的活动输入参数
//总价
public InOutArgument<double> TotalMoney { get; set; }
//折扣率
public InArgument<double> MustMoney { get; set; }
//返回的总价
public InArgument<double> Returnmoney { get; set; } protected override void Execute(CodeActivityContext context)
{
double mustmoney = context.GetValue(MustMoney);
double totalmoney = context.GetValue(TotalMoney);
double returnmoney = context.GetValue(Returnmoney);
ReturnBack returnback =
new ReturnBack(mustmoney,returnmoney);
context.SetValue(TotalMoney, returnback.GetResultTotalMoney(totalmoney)); }
}

DiscountAcitivity活动:

   public sealed class DiscountAcitivity : CodeActivity
{
// 定义一个字符串类型的活动输入参数
public InOutArgument<double> TotalMoney { get; set; }
public InArgument<double> Discount { get; set; } protected override void Execute(CodeActivityContext context)
{
double discount = context.GetValue(Discount);
double totalmoney = context.GetValue(TotalMoney); DisCount discountcls =
new DisCount(discount);
context.SetValue(TotalMoney, discountcls.GetResultTotalMoney(totalmoney)); }
}
}

窗体层的代码:

 public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} double totalmoney;
private void button1_Click(object sender, EventArgs e)
{
totalmoney = totalmoney + double.Parse(textBox1.Text) * double.Parse
(textBox2.Text);
listView1.Items.Add("单价:" + textBox1.Text + " 数量:" + textBox2.Text);
} private void button2_Click(object sender, EventArgs e)
{
//BuyBusinessService bs =
// new BuyBusinessService();
//label3.Text =
// bs.GetReturnMoney(comboBox1.SelectedItem.ToString(), totalmoney).ToString(); Dictionary<string, object> dics =
new Dictionary<string, object>();
dics.Add("Type", comboBox1.SelectedItem.ToString());
dics.Add("TotalMoney", totalmoney);
WorkflowApplication instance =
new WorkflowApplication(new CashWorkflow(),dics); //输出完成时
instance.Completed =
new Action<WorkflowApplicationCompletedEventArgs>(workflowcompleted); } private void workflowcompleted(WorkflowApplicationCompletedEventArgs args)
{
//label3.Text = args.Outputs["TotalMoney"].ToString();
SetTotalMoney(args.Outputs["TotalMoney"].ToString());
} delegate void SetTotalmoneyCallBack(string totalmoney); private void SetTotalMoney(string totalmoney)
{
if(this.label3.InvokeRequired)
{
SetTotalmoneyCallBack callbacks =
new SetTotalmoneyCallBack(SetTotalMoney);
this.label3.Invoke(callbacks, new object[] { totalmoney });
}
label3.Text = totalmoney;
}
}

添加事务:

创建Employee 表给Age 字段添加约束:

ALTER TABLE Employee
ADD CONSTRAINT ck_Employee_Age CHECK(age BETWEEN 20 AND 60)

创建:EmployeeInfoCreateActivity

  public sealed class EmployeeInfoCreateActivity : CodeActivity
{
// 定义一个字符串类型的活动输入参数
//定义输入的参数
public InArgument<string> Name { get; set; }
public InArgument<int> Age { get; set; } // 如果活动返回值,则从 CodeActivity<TResult>
// 并从 Execute 方法返回该值。
TestContainer dbcontext =
new TestContainer();
protected override void Execute(CodeActivityContext context)
{
var name = context.GetValue(Name);
var age = context.GetValue(Age);
var employee = new Employee
{
Id = Guid.NewGuid(),
Name = name,
Age = age
};
dbcontext.Set<Employee>().Add(employee);
dbcontext.SaveChanges();
}
}

未处理的异常:

 static void Main(string[] args)
{
WorkflowApplication instance =
new WorkflowApplication(new Workflow1());
instance.Completed =
new Action<WorkflowApplicationCompletedEventArgs>(workflowcompleted);
//未处理的异常
instance.OnUnhandledException =
new Func<WorkflowApplicationUnhandledExceptionEventArgs, UnhandledExceptionAction>(unhandledexception);
instance.Aborted =
new Action<WorkflowApplicationAbortedEventArgs>(abortexception);
instance.Run();
Console.ReadLine();
} static void workflowcompleted(WorkflowApplicationCompletedEventArgs args)
{
Console.WriteLine("流程完成状态:"+args.CompletionState);
} static UnhandledExceptionAction unhandledexception(WorkflowApplicationUnhandledExceptionEventArgs args)
{
Console.WriteLine("未处理异常:" + args.UnhandledException.Message);
return UnhandledExceptionAction.Terminate;
} static void abortexception(WorkflowApplicationAbortedEventArgs args)
{
Console.WriteLine(args.Reason);
}

添加事务的引用:using System.Transactions;

TranasctionControllerActivity

  public sealed class TranasctionControllerActivity : NativeActivity
{
/// <summary>
/// 控制事务的处理
/// </summary>
/// <param name="context"></param>
protected override void Execute(NativeActivityContext context)
{
//对工作流中事务进行的访问
RuntimeTransactionHandle transactionhandle
= new RuntimeTransactionHandle();
//获取事务中先关的信息
transactionhandle = context.Properties.Find(transactionhandle.ExecutionPropertyName)
as RuntimeTransactionHandle;
var transaction = transactionhandle.GetCurrentTransaction(context);
transaction.Rollback(new Exception("内部手工回滚"));
transaction.TransactionCompleted += Transaction_TransactionCompleted;
} private void Transaction_TransactionCompleted(object sender, TransactionEventArgs e)
{
Console.WriteLine("事务的隔离级别:"+e.Transaction.IsolationLevel);
Console.WriteLine("事务创建时间:" + e.Transaction.TransactionInformation.CreationTime);
}
}

调用外部的组件:

写一个外部调用的类库:

   public class Compute
{
public static int Add(int a,int b)
{
return a + b;
} public int AddI(int a,int b)
{
return a + b + 100;
} public string AddString(params string[] s)
{
string str="";
for(int i=0;i<s.Length;i++)
{
str = str + s[i];
}
return str;
} public void ChangeC(out int c)
{
c = 500;
} public int AddT<T>(T a,T b)
{
return int.Parse(a.ToString()) + int.Parse(b.ToString());
}
}

拖入一个Sequence放入InvokeMethod调用方法:

会签的工作流程演示代码:

  public sealed class ApprovalActivity : NativeActivity
{
public InArgument<string> BookMarkName { get; set; }
public OutArgument<string> ApprovalResult { get; set; } protected override bool CanInduceIdle
{
get { return true; }
}
protected override void Execute(NativeActivityContext context)
{
var bookmarkname = context.GetValue(BookMarkName);
context.CreateBookmark(bookmarkname,callback);
} private void callback(NativeActivityContext context,Bookmark bookmark,object obj)
{
context.SetValue(ApprovalResult, obj.ToString()); } }
 public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} WorkflowApplication instance;
private void button1_Click(object sender, EventArgs e)
{
instance = new WorkflowApplication(new Activity1());
instance.Idle =
new Action<WorkflowApplicationIdleEventArgs>(workflowidle);
//完成
instance.Completed =
new Action<WorkflowApplicationCompletedEventArgs>(workflowcompleted);
instance.Run();
} private void workflowidle(WorkflowApplicationIdleEventArgs args)
{
if(instance!=null)
{
if(args.Bookmarks.Count(p=>p.BookmarkName.Contains("BookMark1"))!=0)
{
SetLabel("等待审批", label1);
}
}
}
private void workflowcompleted(WorkflowApplicationCompletedEventArgs args)
{
SetLabel("第一位审批人:"+args.Outputs["ApprovalResult1"].ToString()+
" 第二位审批人:" + args.Outputs["ApprovalResult2"].ToString()+
" 第二位审批人:" + args.Outputs["ApprovalResult3"].ToString(), label2);
} delegate void SetLabelCallBack(string labstring, Label label);
private void SetLabel(string labstring,Label label)
{
SetLabelCallBack callback =
new SetLabelCallBack(SetLabel);
if(label.InvokeRequired)
{
label.Invoke(callback, new object[] { labstring, label });
}
label.Text = labstring;
} private void button2_Click(object sender, EventArgs e)
{
ResumeActivity("BookMark1", comboBox1.SelectedItem.ToString());
} private void ResumeActivity(string bookmarkname,string cb)
{
instance.ResumeBookmark(bookmarkname, cb);
} private void button3_Click(object sender, EventArgs e)
{
ResumeActivity("BookMark2", comboBox2.SelectedItem.ToString());
} private void button4_Click(object sender, EventArgs e)
{
ResumeActivity("BookMark3", comboBox3.SelectedItem.ToString());
}
}

DDD模型领域WF到领域层(十五)的更多相关文章

  1. Java开发架构篇:DDD模型领域层决策规则树服务设计

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 在上一章节介绍了领域驱动设计的基本概念以及按照领域驱动设计的思想进行代码分层,但是仅 ...

  2. 从壹开始微服务 [ DDD ] 之三 ║ 简单说说:领域、子域、限界上下文

    前言 哈喽大家好,DDD领域驱动设计系列又开始了,前天周二的那篇入门文章中,也收到了一定的效果(写小说的除外),同时我也是倍感鸭梨,怎么说呢,DDD领域驱动设计已经有十年历史了,甚至更久,但是包括我在 ...

  3. 如何一步一步用DDD设计一个电商网站(十)—— 一个完整的购物车

     阅读目录 前言 回顾 梳理 实现 结语 一.前言 之前的文章中已经涉及到了购买商品加入购物车,购物车内购物项的金额计算等功能.本篇准备把剩下的购物车的基本概念一次处理完. 二.回顾 在动手之前我对之 ...

  4. 如何一步一步用DDD设计一个电商网站(十二)—— 提交并生成订单

    阅读目录 前言 解决数据一致性的方案 回到DDD 设计 实现 结语 一.前言 之前的十一篇把用户购买商品并提交订单整个流程上的中间环节都过了一遍.现在来到了这最后一个环节,提交订单.单从业务上看,这个 ...

  5. 如何一步一步用DDD设计一个电商网站(十四)—— 回顾与总结

    本系列所有文章 如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念 如何一步一步用DDD设计一个电商网站(二)—— 项目架构 如何一步一步用DDD设计一个电商网站(三)—— 初涉核心域 如 ...

  6. 贫血模型和DDD模型

    贫血模型和DDD模型 1.贫血模型 1.1 概念 常见的mvc三层架构 简单.没有行为 2.领域驱动设计 2.1 概念(2004年提出的) Domain Driven Design 简称 DDD DD ...

  7. 第四百一十五节,python常用排序算法学习

    第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...

  8. Coding and Paper Letter(十五)

    资源整理. 1.Nature Climate Change论文"Higher temperatures increase suicide rates in the United States ...

  9. 谈谈一些有趣的CSS题目(十五)-- 奇妙的 background-clip: text

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

随机推荐

  1. mysql常用sql汇总

    给一张表新增一个字段 ALTER table student add zz INT() DEFAULT COMMENT '0是授权 1未授权' 给表student 新增一个zz的字段 默认是0 后面是 ...

  2. idea常用快捷键及自定义快捷键汇总

    以下都是挨个进行验证过的 生成get和set方法为:alt+insert 自动补全返回值,自动补全变量名称和属性名称:ctrl+alt+v 输入System.out.println()的快捷方法是:输 ...

  3. vue自学入门-2(vue创建项目)

    本人也是刚学习VUE,边找资料,边学习,边给大家分享.1.创建项目 2.启动项目 3.注意上面和下面全部用cnpm

  4. 第18月第25天 github下载单个文件夹 git命令

    1. 用 SVN 即可. 举例说明: 譬如这个项目: Mooophy/Cpp-Primer · GitHub, 我只想看 ch03 文件夹的代码怎么办? 先打开 ch03, 其 URL 为: &quo ...

  5. 第18月第21日 vue cnpm

    1. 首先我们需要下载npm,因为我已经提前安装了node.js,安装包里面集成了npm,然后我们就可以利用npm命令从获取淘宝镜像的cnpm了. 1.打开命令行窗口,输入 npm install - ...

  6. POJ 1811 Prime Test (Rabin-Miller强伪素数测试 和Pollard-rho 因数分解)

    题目链接 Description Given a big integer number, you are required to find out whether it's a prime numbe ...

  7. mysql 原理 ~ 常规锁

    一 模式 RR模式二 mysql锁相关场景  1 有间隙的地方就可能有间隙锁,并非只有辅助索引的场景下才会存在gap lock,典型场景 id主键的范围查询  2 varchar的范围锁定原理和int ...

  8. img格式镜像转ISO格式

    在做汇编学习时,需要用比较老的Windows XP来进行调试学习,因此找了最老的Windows XP(CN_WINXP_PRO_ISO,无SP版本 ),下载后发现镜像文件格式是img的,而virtua ...

  9. RunLoop 原理和核心机制

    搞iOS之后一直没有深入研究过RunLoop,非常的惭愧.刚好前一阵子负责性能优化项目,需要利用RunLoop做性能优化和性能检测,趁着这个机会深入研究了RunLoop的原理和特性. RunLoop的 ...

  10. Freemarker进行非空处理

    1.需求是这样的: 一个对象可能有图片,也可能没有,在对象有图片的时候输出图片,没有的时候不做处理. 2.新建一个doc文档,另存为Xml文档(2003版本的). 修改Xml文档:用Freemarke ...