我在序列化为WorkflowService
时遇到问题,其ActivityBuilder
参数包含Body
。 ActivityBuilder
包含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应用程序中托管它。
谢谢!
答案 0 :(得分:0)
您不能将ActivityBuilder用作WorkflowService的主体,ActivityBuilder只是用于在设计时操作Activity。要将ActivityBuilder转换为Activity,请使用ActivityXamlServices.CreateBuilderWriter。
您可以利用XamlServices.Transform将XamlReader通过ActivityBuilder传递给您在ActivityXamlServices.CreateBuilderWriter中创建的编写器。