سؤال

أواجه مشكلة صغيرة في فهم Servowntype في WCF.

مأخوذ من هذه المدونة, ، الكود التالي لا يعمل:

[DataContract(Namespace = “http://mycompany.com/”)]
public class Shape{…}

[DataContract(Namespace = “http://mycompany.com/”)]
public class Circle : Shape {…}

[ServiceContract]
public interface IMyServer
{
    [OperationContract]
    bool AddShape(Shape shape);
}

.

IMyServer client = new ChannelFactory<IMyServer>(binding, endPoint).CreateChannel();

client.AddShape(new Circle());

السبب في عدم عمله هو أنك تحاول إضافة دائرة ، لكن برنامج ServiceContract يسمح فقط بالشكل. من المفترض أن تفعل شيئًا مع أنواع معروفة ، لكنني مرتبك بعض الشيء بشأن كيفية عمل ذلك.

نظرًا لأن هذا الرمز موجود في الخدمة ، فلماذا لا يعرف تلقائيًا أن الدائرة مستمدة من الشكل؟ بالإضافة إلى ذلك ، ما الذي يفعله Servicentype بالفعل؟

عندما يتم وضع Servicentype أسفل DataContract ، يبدو أن هذا يجعلها تعمل. أظن أنه يقول مهلا ، هذا النوع المحدد الذي يسمى الشكل يمكن أن يكون أيضًا دائرة. أواجه مشكلة في فهم سبب قيامه بذلك بهذه الطريقة ، لأنه إذا أضفت نوعًا جديدًا مثل Square ، فسيتعين عليك إضافة إلى ServicenType من الفئة A. ألن يكون من المنطقي أن يستنتج ذلك ، لوضع النوع المعروف على المربع بدلاً من الشكل؟ لذا فإن المربع يقول مهلا ، أنا شكل ، ولا يجب أن تملأ مع فئة الشكل؟ إذا تم دمج فئة الشكل الخاصة بك في مكتبة وكنت ترغب في إنشاء شكل خاص بك مثل Diamondshape ، فلا يمكنك إضافته إلى فئة الشكل لأنه لا يمكنك الوصول إلى التعليمات البرمجية المصدر.

هل كانت مفيدة؟

المحلول

المشكلة هي أن WCF لا تدخل في جميع التجميعات ويحاول العثور على جميع أنواع الشكل الفرعية. كما أنه لا ينقل معلومات النوع (التجميع ، اسم النوع المؤهل بالكامل) مع مستند XML.

لذلك ، على الرغم من أنه لن يكون من مشكلة إنشاء علامة "دائرة" على XML الصادرة ، فإن Deserializater الواردة لن يعرف ماذا تفعل بهذا.

يشبه "الاختراق" المعروف السجل لأنواع معروفة يجب تنفيذها من قبل كلا الجانبين. انها صريحة. مع هذا السجل ، يعرف Deserializer أن "Circle" يسير على النوع X ، دون أي فرصة للأماء ودون الحاجة إلى تحليل جميع التجميعات المتاحة أو القابلة للوصول لأنواع مشتقة.

تذكر أن Square لا يقول "أنا شكل" ، فهو يأتي كعلامة XML ومن هذا لا تعرف بسهولة وتلقائي أي فئة .NET التي يجب استخدامها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top