/*
# 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. vim + ctags + taglist配置和使用

    vim +ctags + taglist ,ctags+cscope 安装配置和使用 内容:VIM下ctags和taglist的安装配置方法:一键安装 ctags和cscope的方法 :vim语法高亮 ...

  2. Adapt适配器

    为接口提供所有的空实现,让使用者仅仅覆盖需要的部分: 本思想肯定有问题,慢慢考究 frame.addWindowListener(new WindowAdapter() { @Override pub ...

  3. Java多线程 2 线程的生命周期和状态控制

    一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就 ...

  4. MySQL安装与设置

    下载zip,配置 1,系统变量添加:...\mysql-5.7.10-winx64,环境变量添加:%MYSQL_HOME%\bin 2,修改MySQL.ini basedir=(同系统变量路径) da ...

  5. hibernate学习二(HelloWorld)

    一.建立hibernate配置文件 在工程Hibernate_01_HelloWorld下的src上建立hibernate.cfg.xml,打开hibernate-release-4.3.11.Fin ...

  6. tyvj1468 清理垃圾

    背景 聚会结束,留下许多垃圾.Candy:"好多垃圾啊,飘飘乎居士,我们一起处理垃圾吧!" 描述     Candy家里总共有n个垃圾等待处理,每个垃圾对于Candy和飘飘乎居士处 ...

  7. nginx tomcat session丢失的问题

    nginx反向代理tomcat,出现seesion获取不到的问题. 网上搜索到的解决方案大多是集群tomcat共享session共享的问题,但我这个只有一台tomcat服务器,不涉及到服务器集群问题. ...

  8. [NOIP2016]愤怒的小鸟

    题目描述 Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可以用它向第一象限发射一只红色的小鸟,小鸟们的飞行轨迹均为形 ...

  9. Longest Substring Without Repeating Characters

    Given a string, find the length of the longest substring without repeating characters. Examples: Giv ...

  10. clearfix的应用

    之前遇到一个问题,引用Bootstrap框架时 一行显示四个模块,小屏幕时显示两个模块 当内容一样时,大小屏幕时一样的,但是当其中一个和另一个内容不同时,展示效果就会有错乱 <div class ...