我有一个明确定义的服务合同,它暴露了一堆方法。我们有一个这个合同的典型服务实现,它与我们的MVC App一起托管在IIS 7中。
该体系结构是一个典型的分布式应用程序,其接口在基本核心库(可重新分发)中定义,独立服务库中的实现,最后是MVC App暴露实现的终点(在服务图书馆内。)
现在的情况是,这些现有服务方法之一需要执行一个逻辑过程,执行最多可能需要10分钟。在正常情况下,我们会考虑工作流服务,但是所讨论的界面正在使用中,我们有一套单元测试来测试我们的服务等。我们真的无法摆脱我们的这种实现。
所以我的问题是 -
答案 0 :(得分:6)
WorkflowApplication
来执行工作流程定义。这将负责在WF运行时特定线程上使用WF运行时执行/跟踪每个WF实例(即不阻止WCF I / O线程)。WorkflowApplication
实例使用异步BeginRun
启动WF,如果您关心跟踪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);
}
}