سؤال

يعد هذا السؤال بمثابة استكشاف لاكتشاف ما يفعله الأشخاص في المجتمع، في المواقف العملية، أكثر من كونه سؤالًا مستهدفًا بشكل محدد.لقد بحثت على نطاق واسع جدًا حول هذا الأمر، وبينما وجدت الكثير من المدونين يؤيدون تصميم خدمة العقد أولاً وبعض التعليقات التي تدعمهم، لم أجد بعد الكثير من المعلومات العملية حول تنفيذ العقد أولاً مع WCF، والإيجابيات والسلبيات للقيام بذلك في بيئة العالم الحقيقي، وما إلى ذلك.لقد قمت مؤخرًا ببعض الأبحاث المكثفة حول SOA، بشكل أساسي من خلال كتب Thomas Erl، وأحد المفاهيم الأساسية التي يؤيدها هو تصميم العقد أولاً.

أسئلتي هي على النحو التالي:

  1. كيف تتعامل مع تصميم الخدمة ذات العقد الأول مع .NET وWCF؟
  2. هل هناك أدوات أخرى إلى جانب svcutil يمكنها إنشاء كل من العميل والخدمة من العقد؟(أي شيء يتكامل مع VS سيكون مثاليًا)
  3. ما هي الإيجابيات التي واجهتها في العالم الحقيقي فيما يتعلق بتصميم العقد الأول وwCF؟
  4. ما هي السلبيات الواقعية التي واجهتها مع تصميم العقد الأول وWCF؟

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

يحرر:

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

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

المحلول

WSCF يوفر أداة العقد الأول مع تكامل VS.تحقق من ذلك.(حر)

اعتبارًا من السادس من يوليو، هناك إصدار ثنائي مع برنامج إعداد.

نصائح أخرى

أستخدم نهج العقد أولاً، بشكل عام (ولكن ليس دائمًا) باستخدام نفس النوع من التمثيل في كل طرف.

في الواقع، لاستخدام WCF لا تحتاج إلى أي وكلاء خاصين وما إلى ذلك؛يمكنك استخدام أنواع .NET العادية في كلا الطرفين وعدم استخدامها svcutil.exe على الاطلاق.يعد الحصول على خدمة عاملة أمرًا بسيطًا مثل إضافة "ABC" إلى ملف التكوين واستخدام شيء مثل:

public sealed class WcfClient<T> : System.ServiceModel.ClientBase<T>
    where T : class
{
    public T Service { get { return base.Channel; } }
}

الآن يمكنك استخدام:

using(var client = new WcfClient<IMyService>()) {
    int i = client.Service.SomeMethod("abc");
}

وكل ما لديك عند العميل (والخادم) هو ما لديك IMyService واجهه المستخدم.


لأدوات أخرى؛protobuf-net هو تطبيق لواجهة برمجة التطبيقات "API الخاصة بالبروتوكولات المؤقتة" من Google، والتي تحتوي على DSL لوصف البيانات والخدمات بطريقة "العقد أولاً" (والمحمولة/القابلة للتشغيل البيني) - على سبيل المثال (ملف .proto):

message SearchRequest {
  required string query = 1;
  optional int32 page_number = 2;
  optional int32 result_per_page = 3;
}
message SearchResponse {
  repeated string result = 1; 
}
service SearchService {
  rpc Search (SearchRequest) returns (SearchResponse);
}

تتضمن أداة protobuf-net (التي أحتفظ بها) أداة مساعدة "protogen" لتحويل DSL هذا إلى C#/VB؛وأحد الخيارات (بالنسبة لـ C#، على الأقل - سأحتاج إلى التحقق من VB) هو إصدار تطبيق وكيل WCF كامل (مع اختيارك لطرق المزامنة أو عدم المزامنة)؛يشبه إلى حد كبير svcutil - ولكن (نظرًا لعلاقة protobuf-net) فهو يتضمن العرف [ProtoBehavior] السمة الموجودة في عقود التشغيل بحيث تستخدم مُسلسِل protobuf-net بدلاً من DataContractSerializer (أسرع وأكثر كفاءة، ولكن مختلفة).

لتكامل VS؛أنا أعمل على ذلك بالضبط (دليل).

أنا أفضّل تطوير العقد أولاً.لقد استخدمت مصنع الخدمة لهذا الغرض.لقد سمح لي بإنشاء كل من الخدمة ورمز العميل دون أي تخصيص.

مع التخصيص، تمكنا أيضًا من إنشاء كائنات نقل البيانات المقابلة لكائنات Entity Framework، جنبًا إلى جنب مع التعليمات البرمجية للترجمة من واحدة إلى أخرى؛التسجيل التلقائي للاستثناءات؛وتوثيق HTML للخدمات.

هذا بالإضافة إلى قواعد تحليل التعليمات البرمجية التي تأتي مع Service Factory، والتي تساعد على منع المطور من إطلاق النار على نفسه عن طريق اختيار خيارات WCF غير المتوافقة.

في WCF، لديك بعض التنوع فيما يبدو عليه "العقد أولاً".يمكنك إجراء "عقد التعليمات البرمجية أولاً" حيث يتم التعبير عن بياناتك وعقود الخدمة الخاصة بك كأنواع .NET مع ترميز السمات الصحيحة.يمكنك البدء باستخدام WSDL وإنشاء عقود الخدمة والبيانات، أو يمكنك البدء باستخدام مخطط XML لعقد البيانات الخاص بك، والتعبير عن عقد الخدمة كرمز.تعتمد الطريقة التي ستتبعها حقًا على طبيعة العقد وكيفية استخدامه.

إذا كنت تقوم بتنفيذ شيء ما وفقًا لمواصفات WSDL، فإن إنشاء الكود من WSDL هو الخيار الواضح، والتوليد اليدوي ليس بالأمر الكبير.يمكنك تشغيل الإنشاء من حدث بناء المشروع (أو الدخول إلى msbuild) إذا كنت تريد نشر التغييرات على ملف WSDL على الفور.

إذا كان لديك مخطط (XSD) موجود تريد استخدامه كعقد بيانات، أو تفضل تطوير عقد البيانات الخاص بك بهذه الطريقة لتسهيل إعادة استخدامه في الأنظمة الأساسية الأخرى، فيمكنك إنشاء أنواع من المخطط باستخدام xsd.exe (أو أداة ثالثة) البديل الحزبي).في هذه الحالة، يمكنك استخدام أنواع XML القابلة للتسلسل في عقد الخدمة الموجه نحو التعليمات البرمجية الخاص بك مثل هذا: .

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

والطريقة التي نقوم بها موضحة في هذا الفيديو:

http://www.dnrtv.com/default.aspx?showNum=103

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

يتم بعد ذلك كتابة العقد في الكود ويمكن تغييره، إذا كان هناك عدم تطابق بين العميل والخادم فسيظهر ذلك في خطأ بناء.

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