سؤال

سؤالان حقًا ، ولست متأكدًا مما إذا كنت أفعل هذا بشكل صحيح أم لا ...

أريد إعادة إرسال مجموعة من نوع ما لكائن كيان قمت بإنشائه. لست متأكدًا حقًا من كيفية وضع علامة عليها للإرسال (ما هي السمات المطلوبة أو أي شيء آخر) ، ولست متأكدًا حقًا من كيفية إرسالها مرة أخرى (Ilist ، قائمة ، مجموعة ، iCollection).

من الناحية المثالية ، أحب أن أكون قادرًا على إعادة إرسال ObservableCollection ، لكن هل سيعمل هذا إذا كان العميل الذي يريد استهلاك الخدمة في .NET؟

[ServiceContract(Namespace = "http://www.tempuri.com/MyService",
                 ConfigurationName = "IMyService")]
public interface IMyServie
{
    [OperationContract(Action = "http://www.tempuri.com/MyService/GetUsers",
                       ReplyAction = "*")]
    [XmlSerializerFormat(SupportFaults = true)]
    GetUsersResponse GetUsers(GetUsersRequest request);
}

[MessageContract(IsWrapped = false)]
public sealed class GetUsersRequest
{
    public GetUsersRequest() { }
    public GetUsersRequest(Int32 record = -1)
    {
        Record = record;
    }

    [MessageBodyMember(Namespace = "", Order = 0)]
    public Int32 Record { get; private set; }

}

[MessageContract(IsWrapped = false)]
//[ServiceKnownType(??)]
public sealed class GetUsersResponse
{
    public GetUsersResponse() { }
    public GetUsersResponse(PersonEntity[] entities)
    {
        Entities = entities;
    }

    [MessageBodyMember(Namespace = "", Order = 1)]
    //[XmlElement(DataType = "??")]
    public PersonEntity[] Entities { get; private set; }
    //Should this have been some other type of array-type (Collection, List, etc?)
}

//Does this need any attributes besides Serializable?
[Serializable()]
public PersonEntity : AbstractEntity
{
    public PersonEntity() { }
    public PersonEntity(Int32 id = 0, String fname = "", String lname = "")
    {
        ID        = id;
        FirstName = fname;
        LastName  = lname;
    }

    public String FirstName { get; set; }
    public String LastName { get; set; }

    //Functionality (Clone, Clear, Default, Equals, etc) Removed...
}

[Serializable()]
public abstract class AbstractEntity : IEntity
{
    public Int32 ID { get; set; }

    //Abstracts or Implements some functionality...
}

public interface IEntity
{
    //Defines functionality requirements
}
هل كانت مفيدة؟

المحلول

DataContract هو ما تبحث عنه. لمزيد من التفاصيل تحقق من هذا حلقة الوصل

على واجهة التجميع التي يمكن ملاحظتها ، لست متأكدًا من سبب إرسال صفيف بالنسبة لك. هل يمكنك توضيح المزيد لمساعدتنا على فهم هذا.

نصائح أخرى

عندما يتعلق الأمر بتمرير الكائنات على السلك ، يجب أن تفكر في البيانات بدلاً من السلوك. بقدر ما يتعلق الأمر بذلك ، لن تختلف قائمة أو قابلة للتطبيق أو t [] وسيكون تفضيلي صفيفًا مدعومًا بجميع اللغات. لا ينبغي أن يعرف الخادم أو يقدم أي افتراض غير ضروري حول العميل (WPF ، نماذج Windows ، ...) وكل ما تمر به هو مجموعة من البيانات الأقل إلزامية هي الأفضل: T [] (صفيف T).

كما قال Myermian ، لن تعمل ObservableCollection التي تم إرسالها عبر السلك كملاحظة ObservableCollection على العميل.

كما أنك تستخدم MessageContract أثناء عدم استخدام أي من فوائد الجسم/الرأس. لذلك يجب عليك استخدام DataContract.

تتمثل أكثر الوسائل التي يمكن تشغيلها في إرجاع مجموعة من النوع المعقد ، مهما قررت ذلك. تفضيلي الشخصي هو استخدام كائن DTO مخصص للنقل عبر السلك ، بدلاً من فضح الكيانات الداخلية مباشرة عبر الخدمة.

بخصوص ObservableCollection, ، أقترح عليك لف صفيفك في ObservableCollection جانب العميل بدلاً من محاولة العودة ObservableCollection.

لا تنسى ObservableCollection لن ينقل التغييرات إلى الخدمة ؛ أنت ذاهب إلى H Ave للقيام بذلك يدويًا.

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