实现超市的结算系统:

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

 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. 运用Zabbix实现内网服务器状态及局域网状况监控(5) —— Zabbix监控路由器

    1. 首先在zabbix服务器端安装snmp工具 [root@zabbix ~]# yum -y install net-snmp-utils net-snmp-libs net-snmp-devel ...

  2. UVALive - 7139(差分+模拟)

    题目链接 参考 题意 N*M的网格,一辆车沿着网格线按给定路线走,每个网格里有一个人,人的视线始终看着车,问这些人净转圈数的平方和. 分析 由于车的起点和终点都为左上角,且每个格子里的人永远面对着车, ...

  3. leetcode --binary tree

    1. 求深度: recursive 遍历左右子树,递归跳出时每次加一. int maxDepth(node * root) { if(roor==NULL) return 0; int leftdep ...

  4. .net 重新注册

    今天同事问 一个IIS 的监控站点 .net 出现问题:对于windows 一般都停留在重启生效思想:然并没有生效: 于是建议重新注册.NET : 一般出现原因: 在默认安装路径 重启注册: 默认的安 ...

  5. “微信小程序商城构建全栈应用”开发小记

    注意事项: 1.application\api\extra下的wx.php记得填写小程序的app_id.app_secret: 2.API测试小工具需要APPID:

  6. js_原生js实现上拉加载更多的功能。

    1.人生啊,是我莽撞了啊.这是我公司一个喜欢读书的女孩子的个性签名,喜欢哪些句子,不悲伤,却切切实实的令人喜好. 2.写程序是一件很直接明了的事情,明白了就是明白了,不懂就是不懂,不懂装懂的会让你走很 ...

  7. Tensorflow datasets.shuffle repeat batch方法

    机器学习中数据读取是很重要的一个环节,TensorFlow也提供了很多实用的方法,为了避免以后时间久了又忘记,所以写下笔记以备日后查看. 最普通的正常情况 首先我们看看最普通的情况: # 创建0-10 ...

  8. 硬盘SMART参数解释

    Raw Read Error Rate           底层读取错误率,高值暗示盘体/磁头有问题 Throughput Performance        读写通量性能 (越高越好)      ...

  9. sqlserver 无法获得数据库独占权

    ALTER DATABASE trqxs_cs SET OFFLINE WITH ROLLBACK IMMEDIATE

  10. unbuntu中如何像Windows一样顺畅的切换中英文输入法

    1.首先在unbuntu安装搜狗拼音输入法(这个不用教了) 2.点击右上角的搜狗拼音的图标点击设置进入设置页面 3.选择高级 4.选择Fcitx设置 5.添加输入法英语(美国) 6.在设置中选择按键, ...