/*
# Microshaoft
/r:System.Xaml.dll
/r:System.Activities.dll
/r:System.Activities.DurableInstancing.dll
/r:System.Runtime.DurableInstancing.dll
/r:"D:\Microshaoft.Nuget.Packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll"
*/
namespace Microshaoft
{
using Newtonsoft.Json.Linq;
using System;
using System.Activities;
using System.Activities.Tracking;
using System.Activities.XamlIntegration;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Xaml;
using System.Xml;
using System.Runtime.DurableInstancing;
public static class WorkFlowHelper
{
public static WorkflowApplication CreateWorkflowApplication
(
string xaml
, string localAssemblyFilePath = null
, Func<InstanceStore> onPersistProcessFunc = null
)
{
var activity = XamlToActivity
(
xaml
, localAssemblyFilePath
);
WorkflowApplication workflowApplication = new WorkflowApplication(activity);
if (onPersistProcessFunc != null)
{
workflowApplication.InstanceStore = onPersistProcessFunc();
}
return workflowApplication;
}
public static Activity XamlToActivity
(
string xaml
, string localAssemblyFilePath = null
)
{
Assembly localAssembly = null;
if (string.IsNullOrEmpty(localAssemblyFilePath))
{
localAssembly = Assembly
.GetExecutingAssembly();
}
else
{
localAssembly = Assembly
.LoadFrom(localAssemblyFilePath);
}
var stringReader = new StringReader(xaml);
var xmlReader = XmlReader.Create(stringReader);
var xamlXmlReader = new XamlXmlReader
(
xmlReader
, new XamlXmlReaderSettings()
{
LocalAssembly = localAssembly
}
);
var xamlReader = ActivityXamlServices
.CreateReader
(
xamlXmlReader
);
var activity = ActivityXamlServices
.Load
(
xamlReader
, new ActivityXamlServicesSettings()
{
CompileExpressions = true
}
);
return activity;
}
public static TrackingProfile GetTrackingProfileFromJson
(
string json
, bool isArray = false
)
{
TrackingProfile trackingProfile = null;
var trackingQueries = GetTrackingQueriesFromJson(json, isArray);
if (trackingQueries != null)
{
foreach (var trackingQuery in trackingQueries)
{
if (trackingProfile == null)
{
trackingProfile = new TrackingProfile();
}
trackingProfile
.Queries
.Add(trackingQuery);
}
}
return trackingProfile;
}
public static TrackingParticipant GetTrackingParticipantFromJson<TTrackingParticipant>
(
string json
, bool isArray = false
)
where TTrackingParticipant : TrackingParticipant, new()
{
TrackingParticipant trackingParticipant = null;
TrackingProfile trackingProfile
= GetTrackingProfileFromJson(json, isArray);
if (trackingProfile != null)
{
trackingParticipant = new TTrackingParticipant();
trackingParticipant.TrackingProfile = trackingProfile;
}
return trackingParticipant;
}
public static IEnumerable<TrackingQuery> GetTrackingQueriesFromJson
(
string json
, bool isArray = false
)
{
IEnumerable<TrackingQuery> r = null;
if (isArray)
{
//闭包
var key = string.Empty;
r = JsonHelper
.DeserializeToFromDictionary<string, JObject[], JObject[]>
(
json
, (x, y) =>
{
//闭包
key = x;
return y;
}
)
.SelectMany
(
(x) =>
{
return x;
}
)
.Select
(
(x) =>
{
//闭包
return
GetTrackingQuery(key, x);
}
);
}
else
{
r = JsonHelper
.DeserializeToFromDictionary<string, JObject, TrackingQuery>
(
json
, (x, y) =>
{
return GetTrackingQuery(x, y);
}
);
}
return r;
}
public static TrackingQuery GetTrackingQuery(string queryName, JObject jObject)
{
var json = jObject.ToString();
return
GetTrackingQuery
(
queryName
, json
);
}
public static TrackingQuery GetTrackingQuery(string queryName, string json)
{
TrackingQuery r = null;
if (string.Compare(queryName, "WorkflowInstanceQuery", true) == 0)
{
r = JsonHelper
.DeserializeByJTokenPath<WorkflowInstanceQuery>
(
json
);
}
else if (string.Compare(queryName, "ActivityStateQuery", true) == 0)
{
r = JsonHelper
.DeserializeByJTokenPath<ActivityStateQuery>
(
json
);
}
else if (string.Compare(queryName, "CustomTrackingQuery", true) == 0)
{
r = JsonHelper
.DeserializeByJTokenPath<CustomTrackingQuery>
(
json
);
}
else if (string.Compare(queryName, "FaultPropagationQuery", true) == 0)
{
r = JsonHelper
.DeserializeByJTokenPath<FaultPropagationQuery>
(
json
);
}
else if (string.Compare(queryName, "BookmarkResumptionQuery", true) == 0)
{
r = JsonHelper
.DeserializeByJTokenPath<BookmarkResumptionQuery>
(
json
);
}
else if (string.Compare(queryName, "ActivityScheduledQuery", true) == 0)
{
r = JsonHelper
.DeserializeByJTokenPath<ActivityScheduledQuery>
(
json
);
}
else if (string.Compare(queryName, "CancelRequestedQuery", true) == 0)
{
r = JsonHelper
.DeserializeByJTokenPath<CancelRequestedQuery>
(
json
);
}
return r;
}
}
}
namespace Microshaoft
{
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.IO;
using System.Linq;
using System.Xml.Linq;
using System.Collections.Generic;
public static class JsonHelper
{
public static string XmlToJson
(
string xml
, Newtonsoft
.Json
.Formatting formatting
= Newtonsoft
.Json
.Formatting
.Indented
, bool needKeyQuote = false
)
{
XNode xElement;
xElement = XElement.Parse(xml).Elements().First();
string json = string.Empty;
using (var stringWriter = new StringWriter())
{
using (var jsonTextWriter = new JsonTextWriter(stringWriter))
{
jsonTextWriter.Formatting = formatting;
jsonTextWriter.QuoteName = needKeyQuote;
var jsonSerializer = new JsonSerializer();
jsonSerializer.Serialize(jsonTextWriter, xElement);
json = stringWriter.ToString();
}
}
return json;
}
public static string JsonToXml
(
string json
, bool needRoot = false
, string defaultDeserializeRootElementName = "root"
)
{
if (needRoot)
{
json = string.Format
(
@"{{ {1}{0}{2} }}"
, " : "
, defaultDeserializeRootElementName
, json
);
}
//XmlDocument xmlDocument = JsonConvert.DeserializeXmlNode(json, defaultDeserializeRootElementName);
var xDocument = JsonConvert
.DeserializeXNode
(
json
, defaultDeserializeRootElementName
);
var xml = xDocument
.Elements()
.First()
.ToString();
return xml;
}
public static T DeserializeByJTokenPath<T>
(
string json
, string jTokenPath = null //string.Empty
)
{
var jObject = JObject.Parse(json);
var jsonSerializer = new JsonSerializer();
if (string.IsNullOrEmpty(jTokenPath))
{
jTokenPath = string.Empty;
}
var jToken = jObject.SelectToken(jTokenPath);
using (var jsonReader = jToken.CreateReader())
{
return
jsonSerializer
.Deserialize<T>(jsonReader);
}
}
public static string Serialize
(
object target
, bool formattingIndented = false
, bool keyQuoteName = false
)
{
string json = string.Empty;
using (StringWriter stringWriter = new StringWriter())
{
using (var jsonTextWriter = new JsonTextWriter(stringWriter))
{
jsonTextWriter.QuoteName = keyQuoteName;
jsonTextWriter.Formatting = (formattingIndented ? Formatting.Indented : Formatting.None);
var jsonSerializer = new JsonSerializer();
jsonSerializer.Serialize(jsonTextWriter, target);
json = stringWriter.ToString();
}
}
return json;
}
public static void ReadJsonPathsValuesAsStrings
(
string json
, string[] jsonPaths
, Func<string, string, bool> onReadedOncePathStringValueProcesssFunc = null
)
{
using (var stringReader = new StringReader(json))
{
using (var jsonReader = new JsonTextReader(stringReader))
{
bool breakAndReturn = false;
while
(
jsonReader.Read()
&&
!breakAndReturn
)
{
foreach (var x in jsonPaths)
{
if (x == jsonReader.Path)
{
if (onReadedOncePathStringValueProcesssFunc != null)
{
var s = jsonReader.ReadAsString();
breakAndReturn
= onReadedOncePathStringValueProcesssFunc
(
x
, s
);
if (breakAndReturn)
{
break;
}
}
}
}
}
}
}
}
public static IEnumerable<TElement>
DeserializeToFromDictionary<TKey, TValue, TElement>
(
string json
, Func<TKey, TValue, TElement> OnOneElementProcessFunc
)
{
//IEnumerable<TElement> r = default(IEnumerable<TElement>);
return
DeserializeByJTokenPath<Dictionary<TKey, TValue>>(json)
.Select
(
(x) =>
{
var rr = OnOneElementProcessFunc(x.Key, x.Value);
return rr;
}
);
//return r;
}
}
}
namespace Microshaoft
{
using System;
using System.Activities.Tracking;
public class CommonTrackingParticipant : TrackingParticipant
{
public Func<TrackingRecord, TimeSpan, bool> OnTrackingRecordReceived;
protected override void Track(TrackingRecord record, TimeSpan timeout)
{
var r = false;
if (OnTrackingRecordReceived != null)
{
r = OnTrackingRecordReceived(record, timeout);
}
}
}
}

WorkFlowHelper的更多相关文章

  1. WF4与MVC结合示例

    很多初学者,首先最想解决的问题是:如何将WF与MVC程序相结合.由于Web程序属于长时间运行的流程,因此持续化功能的运用就非常重要了. 本文将结合书签.WorkflowApplication.生命周期 ...

  2. AJAX请求.net controller数据交互过程

    AJAX发出请求 $.ajax({ url: "/Common/CancelTaskDeal", //CommonController下的CancelTaskDeal方法 type ...

  3. 工作流2013 assign to问题

    根据您的确认, 该问题已经通过我们所提供的方案进行修改后测试通过, 问题解决. 以下为该问题的产生原因: SharePoint 2013使用的默认认证机制与2007不一样,  2007使用的是Wind ...

  4. K2工作流引擎Demo

    ---恢复内容开始--- 以前的工作都是电商网站形式的,从未接触过工作流相关工作,新公司是传统制造业行业,我进的这个组又是做工作流这块相关工作的,所以避免不了和工作流打交道. 这边工作流主要用K2来做 ...

随机推荐

  1. OpenStack三种类型的NAT转换

    SNAT SNAT即源网络地址转换,这个NAT路由修改IP包包头中的源IP地址.SNAT功能通常用于让只具有私有IP地址的主机能够访问外网,比如,多个PC使用路由器共享上网,每个PC都配置了内网IP, ...

  2. CSS 高级布局技巧

    随着 IE8 逐渐退出舞台,很多高级的 CSS 特性都已被浏览器原生支持,再不学下就要过时了. 用 :empty 区分空元素 兼容性:不支持 IE8 /*假如我们有以上列表:*/ <div cl ...

  3. 【学习笔记】Struts2之一个Action包含多个控制处理逻辑

    一.使用Action的动态方法调用     如果一个页面包含多个按钮,系统分别提交给Action的不同方法处理.此时可以采用DMI(Dynamic Method Invocation,动态方法调用)来 ...

  4. 写一个适应所有环境的js模块

    说下背景: 在ES6以前,JS语言没有模块化,如何让JS不止运行在浏览器,且能更有效的管理代码, 于是应运而生CommonJS这种规范,定义了三个全局变量: require,exports,modul ...

  5. 我的页面定制CSS代码(SimpleGamboge皮肤)

    我的页面定制CSS代码,针对博客园SimpleGamboge皮肤. 调整: 1.左上图片更换为自己的头像 2.扩大左侧栏宽度,缩小右侧主栏宽度宽度 3.扩大内容页面的评论区宽度,工具图标靠左 4.去广 ...

  6. V4L2框架分析学习一

    转载于http://www.techbulo.com/1193.html 1.概述 Video4Linux2是Linux内核中关于视频设备的内核驱动框架,为上层的访问底层的视频设备提供了统一的接口.凡 ...

  7. BZOJ2292——【POJ Challenge 】永远挑战

    1.题意:dijkstra模板题,存点模板 #include <queue> #include <cstdio> #include <cstdlib> #inclu ...

  8. signalr 配置错误跟踪

    <system.diagnostics> <trace autoflush="true" indentsize="4"> <lis ...

  9. C# 调用webservice 几种办法(转载)

    原文地址: http://www.cnblogs.com/eagle1986/archive/2012/09/03/2669699.html //=========================== ...

  10. 【spoj705】 Distinct Substrings

    [题目描述] 给定一个字符串,计算其不同的子串个数. [输入格式] 一行一个仅包含大写字母的字符串,长度<=50000 [输出格式] 一行一个正整数,即不同的子串个数. [样例输入] ABABA ...