להיפתר מבעית ה-KnownType כאשר עובדים בין מערכות דוט-נט ב-WCF

20 ביולי 2007

אין תגובות

יש מחלקה, NetDataContractSerializer שיודעת לעביר את הטיפוס בהודעה. הבעיה שצריך לעטוף את המחלקה כדי שיהיה אפשר להשתמש בה כ-Attribute.

מאמר בנושא: http://www.thoughtshapes.com/WCF/UsingInterfacesAsParametersTwo.htm

מה שחסר בפתרון  זה היכולת לשים את Attribute על ה-Class ולא על Method. 

כדי ש-Attribute יכול להיות על ה-Class צריך לממש את הממשק IContractBehavior

להלן התוספת שלי:

    public class NetDataContractAttribute : Attribute, IContractBehavior, IOperationBehavior
    {
        #region IOperationBehavior
        public void AddBindingParameters(OperationDescription description, 
BindingParameterCollection parameters) { } public void ApplyClientBehavior(OperationDescription description,
ClientOperation proxy) { ReplaceDataContractSerializerOperationBehavior(description); } public void ApplyDispatchBehavior(OperationDescription description,
DispatchOperation dispatch) { ReplaceDataContractSerializerOperationBehavior(description); } public void Validate(OperationDescription description) { } #endregion private static void ReplaceDataContractSerializerOperationBehavior(
OperationDescription description) { DataContractSerializerOperationBehavior dcsOperationBehavior =
description.Behaviors.Find<DataContractSerializerOperationBehavior>(); if (dcsOperationBehavior != null) { description.Behaviors.Remove(dcsOperationBehavior); description.Behaviors.Add(
new NetDataContractSerializerOperationBehavior(description)); } } #region IContractBehavior Members public void AddBindingParameters(ContractDescription contractDescription,
ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) { } public void ApplyClientBehavior(ContractDescription contractDescription,
ServiceEndpoint endpoint, ClientRuntime clientRuntime) { foreach (OperationDescription od in contractDescription.Operations) { ReplaceDataContractSerializerOperationBehavior(od); } } public void ApplyDispatchBehavior(ContractDescription contractDescription,
ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime) { } public void Validate(ContractDescription contractDescription,
ServiceEndpoint endpoint) { }
#endregion }

 
הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *