DDD模型领域WF到领域层(十五)
实现超市的结算系统:
计算相应的优惠方式的接口
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到领域层(十五)的更多相关文章
- Java开发架构篇:DDD模型领域层决策规则树服务设计
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 在上一章节介绍了领域驱动设计的基本概念以及按照领域驱动设计的思想进行代码分层,但是仅 ...
- 从壹开始微服务 [ DDD ] 之三 ║ 简单说说:领域、子域、限界上下文
前言 哈喽大家好,DDD领域驱动设计系列又开始了,前天周二的那篇入门文章中,也收到了一定的效果(写小说的除外),同时我也是倍感鸭梨,怎么说呢,DDD领域驱动设计已经有十年历史了,甚至更久,但是包括我在 ...
- 如何一步一步用DDD设计一个电商网站(十)—— 一个完整的购物车
阅读目录 前言 回顾 梳理 实现 结语 一.前言 之前的文章中已经涉及到了购买商品加入购物车,购物车内购物项的金额计算等功能.本篇准备把剩下的购物车的基本概念一次处理完. 二.回顾 在动手之前我对之 ...
- 如何一步一步用DDD设计一个电商网站(十二)—— 提交并生成订单
阅读目录 前言 解决数据一致性的方案 回到DDD 设计 实现 结语 一.前言 之前的十一篇把用户购买商品并提交订单整个流程上的中间环节都过了一遍.现在来到了这最后一个环节,提交订单.单从业务上看,这个 ...
- 如何一步一步用DDD设计一个电商网站(十四)—— 回顾与总结
本系列所有文章 如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念 如何一步一步用DDD设计一个电商网站(二)—— 项目架构 如何一步一步用DDD设计一个电商网站(三)—— 初涉核心域 如 ...
- 贫血模型和DDD模型
贫血模型和DDD模型 1.贫血模型 1.1 概念 常见的mvc三层架构 简单.没有行为 2.领域驱动设计 2.1 概念(2004年提出的) Domain Driven Design 简称 DDD DD ...
- 第四百一十五节,python常用排序算法学习
第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...
- Coding and Paper Letter(十五)
资源整理. 1.Nature Climate Change论文"Higher temperatures increase suicide rates in the United States ...
- 谈谈一些有趣的CSS题目(十五)-- 奇妙的 background-clip: text
开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
随机推荐
- 数据结构(六)查找---多路查找树(B+树)
前提 下图B树,我们要遍历它,假设每个节点都属于硬盘的不同页面,我们为了中序遍历所有的元素,页面2-页面1-页面3-页面1-页面4-页面1-页面5.而且我们每经过节点遍历时,都会对节点中的元素进行一次 ...
- JAVA记录-String/StringBuilder/StringBuffer区别
- CentOS6.8下Jenkins+maven+tomcat+git+shell自动构建、部署web应用环境的搭建
参考资料:http://www.cnblogs.com/cheng95/p/6542036.html http://www.cnblogs.com/software-test/p/7068278.ht ...
- 安装阿里云github提供的修改版minikube
由于kubenetes域名背墙(gcr.io),如kubernetes-dashboard服务依赖不能正常使用. $ docker pull gcr.io/google_containers/paus ...
- 嵌入式iframe子页面与父页面js通信方式
iframe框架中的页面与主页面之间的通信方式根据iframe中src属性是同域链接还是跨域链接,有明显不同的通信方式,同域下的数据交换和DOM元素互访就简单的多了,而跨域的则需要一些巧妙的方式来实现 ...
- TwemProxy Redis架构
TwemProxy 1.twemproxy是twitter开发的一个redis代理proxy. 通过Twemproxy可以使用多台服务器来水平扩张redis服务,可以有效的避免redis单点故障问题. ...
- Java类的5个加载步骤
类加载的五个过程分为: 加载 验证 准备 解析 初始化 1 加载 完成三件事: 通过类的全限定名来获取定义此类的二进制字节流 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构 在内存中生成 ...
- mysql 案例 ~ pt-xtrabackup 使用
一 简介:学习innobackup工具使用 二 功能: 备份全库/单库/单表 三 常用命令 一 全库 目的 每天日常备份 备份 innobackupex --defaults-file=/etc ...
- Python 入门基础18 --re模块+内存管理
今日内容: 1.垃圾回收机制 2.re模块 一.垃圾回收机制 在计算机中,不能被程序访问到的数,称之为垃圾 1.1 引用计数 引用计数用来记录值的内存地址被记录的次数 每引用一次就对标记 +1 操作 ...
- IMU 预积分推导
给 StereoDSO 加 IMU,想直接用 OKVIS 的代码,但是有点看不懂.知乎上郑帆写的文章<四元数矩阵与 so(3) 左右雅可比>提到 OKVIS 的预积分是使用四元数,而预积分 ...