Silverlight، التحميل غير المتزامن، البطيء ما هي أفضل طريقة؟

StackOverflow https://stackoverflow.com/questions/355408

سؤال

لقد بدأت في استخدام Silverlight/Flex واصطدمت على الفور باتصال الخدمة غير المتزامن.أنا معتاد على حل مشكلات الوصول إلى البيانات بطريقة OO باستخدام آلية جلب خادم أو أخرى.

لدي مثال التعليمات البرمجية التافهة التالية:

public double ComputeOrderTotal(Order order) 
{ 
   double total = 0;
   // OrderLines are lazy loaded
   foreach (Orderline line in order.Orderlines) 
   { 
       // Article,customer are lazy loaded 
       total = total + line.Article.Price - order.Customer.discount;
   }
   return total;
}

إذا فهمت بشكل صحيح، فهذا الرمز غير ممكن في Flex/Silverlight.يفرض عليك التحميل البطيء العمل مع عمليات الاسترجاعات.IMO المثال البسيط أعلاه سيكون فوضى كبيرة.

هل يمكن لأي شخص أن يعطيني طريقة منظمة لتنفيذ ما ورد أعلاه؟

يحرر:

  • المشكلة هي نفسها بالنسبة إلى Flex/Silverlight ، فإن رمز الزائفة سيكون جيدًا
  • إنه لا يرتبط حقًا ولكن معظم OrMs يستخدم التحميل كسول لذلك سأقوم بإزالة تلك العلامة
  • المشكلة هي التحميل البطيء في النموذج
  • كان المثال أعلاه قابلاً للتنفيذ من جميع البيانات في الذاكرة ، لكننا نفترض أن بعضها يجب جلبه من الخادم
  • لا تساعد عمليات الإغلاق نظرًا لأنه في بعض الأحيان يتم تحميل البيانات بالفعل ولا تكون هناك حاجة إلى جلب غير متزامن
هل كانت مفيدة؟

المحلول 7

C# 5 Async / Await Construct سوف يكاد يكون بالضبط ما أريد ..

شاهد العرض التقديمي لـ Anders Hejlsberg

نصائح أخرى

نعم ، يجب أن أوافق على أن رسم الخرائط O/R عادةً ما يتم على جانب الخادم من التطبيق الخاص بك. في Silverlight طريقة التنفيذ غير المتزامنة هو النمط المطلوب لاستخدامه عند العمل مع الخدمات. لماذا الخدمات؟ لأنه كما قلت من قبل ، لا توجد أداة تعيين O/R في الوقت الحالي يمكن استخدامها على جانب العميل (Silverlight). أفضل طريقة هي أن تكون بيانات O/R الخاصة بك مكشوفة من خلال خدمة يمكن أن تستهلكها تطبيق Silverlight. أفضل طريقة في الوقت الحالي هي استخدام ADO.NET DataServices لنقل البيانات ، وعلى جانب العميل لإدارة البيانات باستخدام LINQ إلى الخدمات. ما هو مثير للاهتمام حقًا حول الإعلانات (مشروع Astoria السابق) هو أنه مصمم لاستخدامه في إطار الكيان ، لكن الأشخاص الجيدين قاموا أيضًا بتطبيق الدعم لـ Iquerable حتى تتمكن من توصيل أي مزود بيانات يدعم LINQ. على سبيل المثال لا الحصر ، يمكنك التفكير في LINQ إلى SQL ، Telerik الوصول المفتوح, ، llblgen ، وما إلى ذلك لدفع التحديثات مرة أخرى إلى الخادم ، يكون مصدر البيانات مطلوبًا لدعم الإعلانات القابلة للاتصالات.

يمكنك أن تنظر بالضبط كيف يمكن القيام بذلك في سلسلة من المدونات التي أعددتها هنا: البدء في ADO.NET Data Services و Telerik Open Access

لا أستطيع التحدث إلى Silverlight ولكن Flex عبارة عن تقنية عميل لمتصفح الويب ولا تحتوي على أي برنامج تشغيل لقاعدة البيانات مضمن في وقت تشغيل Flash.يمكنك إجراء تفاعلات بروتوكول HTTP مع خادم الويب بدلاً من ذلك.إنه موجود في خادم الويب من الطبقة المتوسطة حيث ستقوم بإجراء أي ORM فيما يتعلق باتصال قاعدة البيانات، مثل Java JDBC.يعد Hibernate ORM وiBATIS خيارين شائعين في مساحة الطبقة المتوسطة لـ Java.

وأيضاً بسبب هذا:

مغالطات الحوسبة الموزعة

لا يمكنك إجراء تفاعلات متزامنة من عميل Flex إلى خدمات الطبقة المتوسطة.أصبحت عمليات الشبكة المتزامنة محظورة هذه الأيام وهي السمة المميزة لتطبيق سيئ التصميم - نظرًا للأسباب المذكورة في الرابط أعلاه، يمكن للتطبيق (وغالبًا ما سيظهر) تجربة مستخدم سيئة للغاية.

يمكنك بدلاً من ذلك إجراء مكالمات غير متزامنة لاسترداد البيانات، وتحميل البيانات إلى كائن (كائنات) نموذج تطبيق العميل الخاص بك، ومتابعة تنفيذ العمليات على النموذج.باستخدام Flex وBlazeDS، يمكنك أيضًا الحصول على بيانات الدفع من الطبقة المتوسطة إلى العميل وتحديث كائنات نموذج العميل بشكل غير متزامن.(يعد ربط البيانات إحدى طرق الاستجابة للبيانات التي يتم تحديثها بطريقة تعتمد على الحدث.)

ربما يبدو كل هذا بعيدًا جدًا عن طبيعة الاستفسار في منشورك - ولكن منشورك يشير إلى أنك تسير على أساس غير صحيح تمامًا فيما يتعلق بكيفية فهم التقنيات من جانب العميل التي تحتوي على برمجة غير متزامنة وموجهة بالحدث مدمجة في أساسياتها بنيان.تم تصميم تقنيات عميل RIA هذه بهذه الطريقة عن قصد تمامًا.لذلك ستحتاج إلى معرفة طريقة تفكيرهم إذا كنت ترغب في الحصول على تجربة جيدة ومثمرة في استخدامها.

سأتناول هذا الأمر بمزيد من التفصيل، ومن منظور Flex، في هذه المقالة:

Flex Async I/O مقابل Java وC# Explicit Threading

في تجربتي المباشرة مع Flex ، أعتقد أن هذه المناقشة أصبحت معقدة للغاية.

عرض OO المفاهيمي لا يختلف بين المزامنة والمتزامن. الفرق الوحيد هو أنك تستخدم معالجات الأحداث للتعامل مع المحادثة المضيفة في DAL ، بدلاً من شيء تم إرجاعه من مكالمة الطريقة. وغالبًا ما يحدث ذلك تمامًا على الجانب المضيف ، وليس له أي علاقة مع Flex أو Silverlight. (إذا كنت تستخدم Air لتطبيق محطة العمل ، فقد يكون ذلك في رمز العميل ، ولكن ينطبق الشيء نفسه. وكذلك إذا كنت تستخدم Ajax لفترة طويلة. Silverlight ، بالطبع ، لا يوجد أي مكافئ للهواء.)

لقد تمكنت من تصميم كل ما أحتاجه دون أي تغييرات أخرى مطلوبة لاستيعاب Asynch.

فليكس لديه نموذج واحد متخلف. إذا قمت بإجراء مكالمة متزامنة إلى خادم الويب ، فستمنع واجهة المستخدم الرسومية بالكامل للتطبيق. سيكون للمستخدم تطبيق المجمد حتى تكمل المكالمة (أو أوقات خارجية في حالة خطأ في الشبكة ، وما إلى ذلك).

بالطبع لا يتم كتابة برامج RIA الحقيقية بهذه الطريقة. يظل واجهة المستخدم الرسومية متاحة للوصول إلى المستخدم من خلال استخدام مكالمات ASYNC. كما أنه يجعل من الممكن أن يكون لديك مؤشرات تقدم حقيقية تقدم أزرار إلغاء ، وهكذا إذا كانت طبيعة التفاعل تستدعي مثل هذا.

عرضت تطبيقات Web 1.0 القديمة ، Web 1.0 السلوك المتزامن في تفاعلاتها مع طبقة الويب.

كما تشير مقالتي المرتبطة ، فإن النموذج المفرد المتبادل بين ActionScript3 أمر جيد لأنه نموذج برمجة أبسط بكثير من البديل-كتابة التطبيقات متعددة الخيوط. كان متعدد الخيوط هو نهج كتابة تطبيقات خادم العميل Java Swing أو C# .NET Winform من أجل تحقيق تجربة مستخدم مستجيبة للمشاركة في واجهة المستخدم الرسومية.

إليك مقالة أخرى تتعرض لهذا الموضوع بأكمله من بنية التطبيق غير المتزامنة غير المتزامنة/المراسلة/الحدث:

بناء أنظمة البرمجيات الموزعة للمؤسسات الفعالة الاتصالات التي تعتمد على البيانات مقابل الاتصالات القائمة على السلوك

Silverlight هي تقنية عميل والكائن - الخرائط العلائقية يحدث تمامًا في الخادم. لذلك عليك أن تنسى ORM في Silverlight.

اتباع مثالك ما عليك فعله هو إنشاء خدمة ويب (صابون ، راحة ...) يمكن أن يمنح عميل Silverlight الخاص بك كائن "الطلب" الكامل. بمجرد حصولك على الكائن ، يمكنك العمل معه دون أي اتصال مع الخادم بطريقة طبيعية متزامنة.

عند الحديث عن Silverlight ، يجب عليك بالتأكيد التحقق خدمات RIA.

ببساطة ، فإنه يجلب datacontext من الخادم إلى العميل حيث يمكنك الاستعلام عنه بشكل غير متزامن (ليست هناك حاجة لكتابة خدمات WCF باليد ، يتم كل ذلك بواسطة RIA).

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