目前,让 WCF 使用预编译模型的唯一方法是通过代码手动配置 WCF,特别是ProtoOperationBehavior
手动添加一个,并指定模型:
var behavior = new ProtoOperationBehavior();
behavior.Model = new MyPrecompiledSerializer();
我承认我没有完整的端到端 WCF 示例。我怀疑在新版本中对我来说可能更容易调整ProtoBehaviorExtension
和/或ProtoBehaviorAttribute
允许您通过配置指定自定义序列化程序类型 - 但该代码今天不存在。
在此期间,如果问题是第一次操作有轻微延迟,那么您还可以添加一些您需要的类型,显式遵循默认模型,然后编译它:
RuntimeTypeModel.Default.Add(typeof(Foo), true);
RuntimeTypeModel.Default.Add(typeof(Bar), true);
RuntimeTypeModel.Default.CompileInPlace();
那就是说:编译并不是非常慢 - 如果它导致明显的延迟,我会有点惊讶,除非你的模型真的很复杂(数百种类型)。延迟是否可能只是 WCF、网络、TCP 等开销?
关于SolidBrush
,并且暗示:Color
- 可以在运行时配置它们:
RuntimeTypeModel.Default.Add(typeof(System.Windows.Media.Color), false)
.Add("R", "G", "B", "A");
RuntimeTypeModel.Default.Add(typeof(System.Windows.Media.SolidColorBrush), false)
.Add("Color");
但是,在使用“预编译”时,我还没有添加一种机制来做到这一点——在技术层面上要棘手得多:我不能只在(比如说)属性上使用可执行方法,因为程序集被“检查” precompile”可以用于任何 CLI(Silverlight、WinRT、.NET 1.1、CF 等)——因此,它是由非常不同的机制加载的。
我首选的方法是:不要将其公开为System.Windows.Media.Color
- 编写您自己的 DTO 类来表示数据(而不是最终实现),并在它们之间进行映射。或者,也可以编写自己的实用程序控制台 exe,其作用类似于“预编译”,方法是配置模型然后调用RuntimeTypeModel.Default.Compile(string,string)
or RuntimeTypeModel.Default.Compile(CompilerOptions)
。