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 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
随机推荐
- mysql名词解释
什么是QPS? 单位时间内所处理的事务数 什么是TPS? 单位时间内所处理的查询数 响应时间 并发量 同时处理的查询请求的数量 什么是吞吐量?
- linux系统下安装ruby环境
1. 移除现有 Ruby 默认源 输入以下指令 $gem sources --remove https://rubygems.org/ 2. 使用新的源 输入以下指令 $gem sources -a ...
- Math.random()和UUID.randomUUID().toString()性能对比【纯原】
Math.random()和UUID.randomUUID().toString()性能对比 不言而喻,因为Math.random()不需要保证唯一性,所做的操作远比UUID消耗更小的性能, 在部分要 ...
- 为什么推荐InnoDB引擎使用自增主键?
索引使用时遇到的问题(顺丰)--InnoDB引擎不使用自增主键导致性能问题,也可答最左前缀 InnoDB自增主键 InnoDB主索引(同时也是数据文件)的示意图: 上文讨论过InnoDB的索引实现,I ...
- POJ 2970 The lazy programmer
The lazy programmer Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 2785 Accepted: 70 ...
- 8.SpringBoot 模板引擎 Thymeleaf
1.模板引擎原理 JSP.Velocity.Freemarker.Thymeleaf 都是模板引擎.SpringBoot推荐的Thymeleaf:语法更简单,功能更强大: Thymeleaf模板引擎 ...
- 使用jQuery实现返回顶部功能
<p id="back-to-top"><a href="#top"><span></span>返回顶部< ...
- 近几年杭电OJ大型比赛题目合集【更新到2017年11月初】
2017年: 区域赛网络赛 6194~6205 6206~6216 区域赛网络赛 6217~6229 2016年: 区域赛网络赛 5868~5877 5878~5891 5 ...
- HTML5实现全屏API【进入和退出全屏】
现在主流浏览器基本上实现了全屏效果,但是不同浏览器实现不一样: [进入和退出全屏] // Webkit (works in Safari5.1 and Chrome 15)element.webkit ...
- saltstack系列~第一篇
一 简介:从今天开始学习saltstack 二 salt的认证系列操作 1 原理 saltstack通过/etc/salt/pki/目录下面的配置文件的密钥进行通信,master端接受minion端后 ...