Nik*_*hil 1 wcf workflow-foundation-4
我有一个明确定义的服务合同,它暴露了一堆方法.我们有一个这个合同的典型服务实现,它与我们的MVC应用程序一起托管在IIS 7中.
该体系结构是典型的分布式应用程序,其接口在基础核心库(可重新分发)中定义,独立服务库中的实现,最后是MVC App暴露实现的终点(在服务图书馆).
现在的情况是,这些现有服务方法之一需要执行一个逻辑过程,该过程最多可能需要10分钟才能执行.在正常情况下,我们会考虑工作流服务,但是所讨论的界面正在使用中,我们有一套单元测试来测试我们的服务等,我们真的无法摆脱我们所拥有的这种实现.
所以我的问题是 -
WorkflowApplication
来执行工作流定义.这将负责在WF运行时特定线程上使用WF运行时执行/跟踪每个WF实例(即不阻止WCF I/O线程).WorkflowApplication
实例1使用异步启动WF BeginRun
,如果你关心你的WCF服务跟踪完成/错误,你可以注册必要的Aborted
,Completed
,Unloaded
处理程序.这是一个非常简单的例子:
[DataContract]
public class MyParametersDataContract
{
[DataMember(Order=1, IsRequired=true)]
public string SomeValue
{
get;
set;
}
}
public class IMyService
{
[OperationContract(IsOneWay=true)]
void DoSomething(MyParametersDataContract someParameters);
}
public class MyService : IMyService
{
// Hold your WF definition in a static singleton to reduce overhead of activity realization
public static readonly Lazy<MyFancyWorkflow> MyWorkflow = Lazy<MyFancyWorkflow>(() => new MyFancyWorkflow());
public void DoSomething(MyParametersDataContract someParameters)
{
// Example of translating incoming parameters to WF args
Dictionary<string, object> workflowInputArguments = new Dictionary<string, object>
{
{ "SomeArgument", someParameters.SomeValue }
};
// Create a WFA instance for this request
WorkflowApplication workflowApplication = new WorkflowApplication(MyService.MyWorkflow.Value, workflowInputArguments);
// Example of hooking the completed action
workflowApplication.Completed = (workflowCompletedArgs) =>
{
// do something when workflow has completed
};
// Invoke the running of the WF asynchronously
Task.Factory.FromAsync(
workflowApplication.BeginRun,
workflowApplication.EndRun,
null)
.ContinueWith(runAntecdent =>
{
// Observe/log any exception with starting the WF so it doesn't crash the process
Trace.TraceWarning("WF failed to run: " + runAntecedent.Exception.ToString());
},
TaskContinuationOptions.OnlyOnFaulted);
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3688 次 |
最近记录: |