WCF :: ServiceHost & AddServiceendpoint: هل عكس أنواع الوسائط؟

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

  •  06-09-2019
  •  | 
  •  

سؤال

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

لماذا يتطلب الأمر CerviceHost Ctor عن فئة ملموسة، وتستغرق AddServiceendPoint الواجهة، وليس العكس؟ يبدو أن الأخير أكثر منطقية من وجهة نظر Oop.

النظر فيما يلي:

    [ServiceContract]
    interface IVocalAnimal
    {
        [OperationContract]
        string MakeSound();
    }
  ...      
  public class Dog : IVocalAnimal
  {
     public string MakeSound()
     {
        return("Woof!");
     }
  }
 ...
 public class Cat : IVocalAnimal
  {
     public string MakeSound()
     {
        return("Meeooow!");
     }
  }

حتى الآن نحن Wanto إنشاء خدمة "حيوانات" يمكنك الاتصال بها للحصول على صوت كلب أو قطة عبر / AnimaloundService / Dog أو Animaloundervice / Cat

...
Uri baseAddress = new Uri("net.pipe://localhost/AnimalSoundService");
ServiceHost serviceHost = new ServiceHost(typeof(IVocalAnimal), baseAddress);
serviceHost.AddServiceEndpoint(typeof(Dog), new NetNamedPipeBinding(NetNamedPipeSecurityMode.None), "Dog");
serviceHost.AddServiceEndpoint(typeof(Cat), new NetNamedPipeBinding(NetNamedPipeSecurityMode.None), "Cat");
...

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

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

راجع للشغل، أنا لا أكون محادثا .. أنا فقط أحاول بصراحة أن أفهم كما أنا متأكد من أنه فقد فاتني شيئا هنا.

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

المحلول

عند إنشاء ServiceHost، تقوم بإنشاء الخدمة الفعلية، لذلك يجب أن تكون ملموسة.

نقاط النهاية الخاصة بك، من ناحية أخرى، ما يراه العملاء. لا تريد بالضرورة أن يعرف عملائك تنفيذ تنفيذك - يجب أن يحصلوا على تعريف الواجهة.

يدعم الريندان التنفيذ الخاص، كما تقول: أيهما تستخدمه عند إنشاء ServiceHost. الغرض من نقاط النهاية، لا يوفر تطبيقات متعددة، ولكن لتوفير بروتوكولات / بروتوكولات متعددة للوصول إلى تطبيق واحد.

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

نصائح أخرى

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

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

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

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

على سبيل المثال، قد يكون لديك خدمة تعرض عقدا أحادي الاتجاه عبر MSMQ وعقد اتجاهين عبر HTTP. أو ربما يكشف عن عقد JSON على عنوان URL واحد وواحد XML على آخر.

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