ActivityBuilder.Implementation在序列化时不包含NamespacesForImplementation

时间:2012-12-20 10:22:58

标签: workflow-foundation-4

我在序列化为WorkflowService时遇到问题,其ActivityBuilder参数包含BodyActivityBuilder包含C#表达式,并且序列化的WorkflowService未激活,因为某些C#表达式引用自定义类型。实际错误是“类型'SomeTypeIPassToAnArgument'未定义”。

我的ActivityBuilder是从包含TextExpression.NamespacesForImplementation元素的xaml文件创建的。当WorkflowService被序列化时,这就会丢失,而这似乎是导致问题的原因。

我发现如果我序列化ActivityBuilder本身,则包含名称空间,但使用ActivityBuilder.Implementation失败。不幸的是,当我构建WorkflowService来序列化时,我必须使用ActivityBuilder.Implementation作为其Body参数。我尝试使用TextExpression.SetNamespacesForImplementation方法确保将这些附加到实现中,但这没有帮助。

以下代码段显示了我正在尝试做的事情以及失败的地方。

var loadedXaml = File.ReadAllText(@"C:\workflow.xaml");
Assert.IsTrue(loadedXaml.Contains("NamespacesForImplementation"));

var xamlReader = new XamlXmlReader(new StringReader(loadedXaml));
var builderReader = ActivityXamlServices.CreateBuilderReader(xamlReader);
var builder = XamlServices.Load(builderReader) as ActivityBuilder;

// namespaces are available in the builder itself
Assert.AreNotEqual(0, TextExpression.GetNamespacesForImplementation(builder).Count);

// when saving, the assert fails because the namespaces aren't serialized
var savedXaml = XamlServices.Save(builder.Implementation);
Assert.IsTrue(savedXaml.Contains("NamespacesForImplementation"));

知道为什么这不起作用,或者我可以使用哪种替代方法可行?最终我的目标是能够从xaml加载工作流并将它们合并到一个序列化的WorkflowService中,我可以使用VirtualPathProvider在MVC应用程序中托管它。

谢谢!

1 个答案:

答案 0 :(得分:0)

您不能将ActivityBuilder用作WorkflowService的主体,ActivityBuilder只是用于在设计时操作Activity。要将ActivityBuilder转换为Activity,请使用ActivityXamlServices.CreateBuilderWriter。

您可以利用XamlServices.Transform将XamlReader通过ActivityBuilder传递给您在ActivityXamlServices.CreateBuilderWriter中创建的编写器。