目前任何幫助,只有這樣,才能使WCF使用預編譯的模式將通過代碼手動配置WCF,特別是手動添加ProtoOperationBehavior
,並指定型號:
var behavior = new ProtoOperationBehavior();
behavior.Model = new MyPrecompiledSerializer();
我承認我沒有一個完整的端到端的WCF例子。我懷疑在新版本中,我可能會更容易地調整ProtoBehaviorExtension
和/或ProtoBehaviorAttribute
以允許您通過配置指定自定義序列化器類型 - 但該代碼目前不存在。
在此期間,如果這個問題是在第一次操作稍有延遲,那麼你也可以添加你需要exlicitly腳趾的默認模型類型的幾個,並編譯:
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");
不過,我還沒有使用「預編譯時增加了一個機制來做到這一點「 - 在技術層面上,技術要複雜得多:我不能只在一個屬性上使用可執行的方法,因爲被」預編譯「檢查的程序集可以用於任何CLI(Silverlight,WinRT,.NET 1.1, CF等) - 同樣,它由非常不同的機制加載。
我首選的方法是:不公開爲System.Windows.Media.Color
- 寫表示數據(而不是最終的實現)你自己的DTO類,以及它們之間的映射。或者,也可以通過配置模型,然後調用RuntimeTypeModel.Default.Compile(string,string)
或RuntimeTypeModel.Default.Compile(CompilerOptions)
來編寫您自己的實用程序控制臺exe文件,該文件的行爲類似「預編譯」。
Marc,謝謝你的幫助。我正在嘗試測試並實施您提出的建議。我特別喜歡CompileInPlace的想法,是的,我有數百個DTO。當我全力以赴時,我會繼續跟進。 –
Marc,我在r580和預編譯方面取得了很大的成功,但是我剛剛安裝了r602,現在我有一個問題。我使用ImplicitFields.AllFields來讓我的DTO與最小額外代碼一起工作,並且預編譯運行正常,現在我在任何私有聲明中得到「非公共成員不能用於完整的dll編譯」。有任何想法嗎?謝謝 –