على أن أشارك أنواع بين API ويب الخدمة و العميل ؟ ما هي الخيارات الأخرى ؟

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

سؤال

نحن نعمل على تطوير ويب API خدمة مريحة لتوفير الوصول إلى البيانات المشتركة لجميع تطبيقات المؤسسة.للمساعدة ونحن أيضا نشر عميل واجهة برمجة تطبيقات تغليف جميع HttpClient تفاصيل يوفر بقوة كتبته الوصول إلى البيانات.

هدفنا هو أن تبدأ صغيرة ثم نضيف تدريجيا الميزات, في حين لا يزال الحفاظ على التوافق مع سبق نشر إصدارات العميل API (التوافق مع العملاء من نفس الإصدار الرئيسي)

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

تقاسم أنواع (مشترك الجمعية) بين العميل والخادم

الايجابيات

  • العميل نموذج نموذج الخادم هي دائما ما يصل إلى تاريخ
  • لا التسلسلية/تسلسل مشاكل بسبب نفس أنواع تسلسل/إلغاء تسلسل
  • لا الازدواجية

سلبيات

  • تحتاج إلى العثور على وسيلة لتبادل أنواع بين الخادم و العميل
  • غير الدلالي التعديلات يمكن كسر القائمة تطبيقات العميل (تغيير اسم الفئة أو مساحة الاسم في نموذج الخادم) على الرغم من أنه لا يؤثر على تسلسل سلمان ولذلك ينبغي أن يكون لها أي تأثير
  • خطر كسر كلينت دون أن يدركوا

فصل (ولكن هيكليا ما يعادلها) أنواع العميل والخادم

الايجابيات

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

سلبيات

  • الازدواجية بين الخادم رمز رمز العميل
  • عرضة للخطأ مهمة حفظ من جانب الخادم و العميل هيكل في المزامنة

يبدو أن هناك 50/50 تفضيل كل حل في فريقنا.

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

هل هناك أي إيجابيات وسلبيات تقاسم أنواع بين العميل و الخادم ؟

إذا كنا لا نصيب لهم ، هل هناك طرق لخفض تكاليف الصيانة عند محاولة للحفاظ على العميل نموذج نموذج الخادم في المزامنة ?

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

المحلول

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

في راحة نظام تعرف اقتران بين العميل والخادم يكمن في نوع الوسائط التعاريف الرابط علاقة التعاريف.

في كلا الخيارين ، هي فعالية تبادل أنواع بين العميل والخادم.في الخيار الأول هذه المشاركة هو صريح عبر التنفيذ الملموس يمكن أن تدار باعتبارها حزمة nuget و إصدار مستقل من العميل والخادم.

في الخيار الثاني لديك اثنين من تطبيقات مشتركة أنواع.ولكن انا التخمين كنت لا تخطط على تحديد نوع الوسائط الذي يحدد بوضوح ما خصائص هذه الأنواع هي.لذلك لا يوجد لديك مصدر واحد من الحقيقة أنت لا تعرف ما في بيانات العقد بين العميل والملقم.كيف يمكنك أن تعرف عندما كنت ستطبعها لجعل التغيير التي سوف كسر عميل ؟ على الأقل مع مكتبة مشتركة يمكنك أن تعرف أن الخادم هو الآن باستخدام الإصدار 1.4.7 المشتركة أنواع العميل باستخدام 1.3.9.يمكنك استخدام الإصدارات الدلالي على النوع المشتركة المكتبة أن تعرف عندما كنت كسر التغيير التي من شأنها أن تدفع العميل إلى تحديث.

مع الخيار الثاني ، لديك عميل secer التي سيتم بشكل مستقل إصدار و سيكون أصعب بكثير لتتبع ما إذا كان هناك كسر التغييرات بين اثنين من الإصدارات.

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

لقد صاغ مصطلح Web Pack قبل بضع سنوات لوصف هذه فكرة استخدام مشترك nuget حزمة تحتوي على المشترك اقتران.كتبت بعض المقالات هنا و هنا على هذا الموضوع.

نصائح أخرى

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

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

ولكن لبعض الأسباب قد تفضل تمرير آخر نسخة من نموذج كائن إلى العميل.المعروف النهج هو تحديد DTO الطبقات التي هي مشابهة جدا ولكن ليس بالضبط نفس نموذج أنواع.

في كل طريقة في وحدة تحكم عند جلب البيانات من قاعدة البيانات, تحتاج إلى خريطة استرجاع البيانات من نوع الموديل شكل للمقارنة DTO الدرجة. AutoMapper يجعل هذا التعيين أسهل.

ولذلك تحتاج هذه الخطوات ينبغي القيام به:

  1. تحديد نموذج أنواع داخل الخادم المشروع.
  2. إضافة هذه الحزم إلى الخادم الخاص بك المشروع تبعيات:
    • AutoMapper
    • AutoMapper.امتداد.مايكروسوفت.DependencyInjection (الإصدار 1.2.0)
  3. تعريف MappingProfile (أو MappingConfiguration) داخل مشروع خادم واستخدام services.AddAutoMapper() في ConfigureServices طريقة في بدء التشغيل.cs
  4. تعديل وحدة التحكم الخاصة بك طرق للقيام التخطيط السليم على استرجاع البيانات و العودة يعادل DTO الإخراج من طريقة.
  5. في موازاة ذلك ، يمكنك جعل مشروع جديد يحتوي على DTO الطبقات.هذا المشروع هو مشترك بين الخادم و العميل المشاريع.

ثم على جانب العميل لا تحتاج إلى معرفة أي تفاصيل نموذج أنواع.العميل الخاص بك يعمل فقط مع DTO الطبقات.هذه الطبقات تحتوي على جميع البيانات اللازمة عن العميل.في بعض الحالات قد تحتاج إلى الجمع بين البيانات من عدة نموذج الكائنات توفير حاوية واحدة على جانب العميل.

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