/*
# 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. 【ASP.NET程序员福利】打造一款人见人爱的ORM(一)

          “很多人都不太认可以第三方ORM,因为考虑的点不够全面,没有大用户群体的ORM有保证,这点是不可否认确是事实.但是往往用户群体大的ORM又有不足之处,今天我们就来聊聊关于ORM的话题,打造 ...

  2. js设置鼠标悬停改变背景色

    看了网上那么多的js鼠标悬停时事件,大多数的,说了那么多话,也没解决什么问题,现在直接贴上代码,以供参考 html: <div id="sign">this is te ...

  3. struts2 spring mybatis 整合(test)

    这几天搭了个spring+struts2+mybatis的架子,练练手,顺便熟悉熟悉struts2. 环境:myEclipse10+tomcat7+jdk1.6(1.8的jre报错,所以换成了1.6) ...

  4. Subsonic使用中

    使用中,遇到各种奇葩问题,依依汇总. 1.引用了Subsonic层后,一运行就开始报错,提示未能找到文件!!    //引用后,目标框架可能会被改变,subsonic的默认框架是2.0,请检查框架是否 ...

  5. .net MVC中异常日志

    在日常工作中,我们有些项目可能进入了维护期,但是项目可能存在一些潜伏较深的bug导致我们在测试阶段并未发现,那么错误日志记录为我们的项目维护起着重要的作用.记录系统日志的方法如下 1.在系统根目录建立 ...

  6. jqueryUI弹出框问题

    jqueryui dialog中 select选不中或比较慢 dialog = function(Window,dialogDivId,title,buttons,css) { css = css|| ...

  7. Mysql安装及主从复制配置

    1.下载 mysql数据库 wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.9-linux-glibc2.5-x86_64.ta ...

  8. Ubuntu上Grafana 监控 Docker的技巧

    导读 Grafana 是一个有着丰富指标的开源控制面板.在可视化大规模测量数据的时候是非常有用的.根据不同的指标数据,它提供了一个强大.优雅的来创建.分享和浏览数据的方式. 它提供了丰富多样.灵活的图 ...

  9. Hadoop基础思维导图

  10. CSS导航菜单水平居中的多种方法

    CSS导航菜单水平居中的多种方法 在网页设计中,水平导航菜单使用是十分广泛的,在CSS样式中,我们一般会用Float元素或是「display:inline-block」来解决.而今天主要讲解如何让未知 ...