سؤال

أواجه مشكلة فيما يتعلق بمساحات الأسماء التي تستخدمها مراجع خدمتي. لدي عدد من خدمات WCF ، على سبيل المثال مع مساحة الاسم MyCompany.Services.MyProduct (مساحات الأسماء الفعلية أطول).
كجزء من المنتج ، أقوم أيضًا بتقديم عينة من موقع C# .NET. يستخدم تطبيق الويب هذا مساحة الاسم MyCompany.MyProduct.

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

الآن أريد تغيير هذا لاستخدام مرجع الخدمة الفعلي. بعد إضافة المرجع والكتابة MyCompany.Services.MyProduct في مربع نص مساحة الاسم ، يقوم بإنشاء فئات في مساحة الاسم MyCompany.myproduct.mycompany.services.myproduct. سيئ! لا أريد أن أتغير using التوجيهات في عدة أماكن لمجرد أنني أستخدم فئة وكيل. لذلك حاولت إعداد مساحة الاسم مع global::, ، لكن هذا غير مقبول.

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

الحل الوحيد الذي توصلت إليه حتى الآن هو تعيين مساحة الاسم الافتراضية لتطبيق الويب الخاص بي MyCompany (لأنه لا يمكن أن يكون فارغًا) ، وإضافة مرجع الخدمة كـ Services.MyProduct. لنفترض أن العميل يريد استخدام عينة موقع الويب الخاص بي كنقطة انطلاق ، ويغيرون مساحة الاسم الافتراضية إلى OtherCompany.Whatever, ، من الواضح أن هذا سوف يكسر الحل.

هل هناك حل جيد لهذه المشكلة؟

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

ملاحظة: لقد رأيت هذا السؤال, ، ولكن لم يكن هناك حل مقدم مقبول لحالة الاستخدام الخاصة بي.


تحرير: كما اقترح جون سوندرز ، لقد قدمت بعض الملاحظات إلى Microsoft حول هذا:
Itemoun @ Microsoft Connect

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

المحلول

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

لقد وجدت بديلاً لاستخدام svcutil.exe لإنجاز ما أريد. (IMO) يجعل تحديث مرجع الخدمة أسهل من إعادة تشغيل الأداة.

يجب عليك تحديد مساحة اسم المساحة الخاصة بمساحة الاسم على ServiceContract و DataContracts (انظر المزيد أدناه للتعليق).

[ServiceContract(Namespace = "http://company.com/MyCompany.Services.MyProduct")]
public interface IService
{
    [OperationContract]
    CompositeType GetData();
}

[DataContract(Namespace = "http://company.com/MyCompany.Services.MyProduct")]
public class CompositeType
{
    // Whatever
}

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

بمجرد الانتهاء من ذلك ، قم بتمكين إظهار كافة الملفات الخيار في Solution Explorer. قم بتوسيع مرجع الخدمة الذي أضفته سابقًا. انقر نقرًا مزدوجًا على Reference.svcmap ملف.

سيكون هناك <NamespaceMappings /> العنصر ، الذي ستحتاج إلى تحريره. استمرار مثالي:

<NamespaceMappings>
    <NamespaceMapping
        TargetNamespace="http://company.com/MyCompany.Services.MyProduct"
        ClrNamespace="MyCompany.Services.MyProduct" />
</NamespaceMappings>

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

يمكنك إضافة العديد من التعيينات كما تحتاج (كنت بحاجة بالفعل اثنين). التأثير هو نفسه svcutil /namespace: اقترب ، ولكن دون الحاجة إلى استخدام سطر الأوامر تستخدم نفسه ، مما يجعل التحديث أسهل.

الفرق مع Svcutil

الجانب السلبي لهذا النهج هو أنك تحتاج إلى استخدام تعيينات مساحة الاسم الصريحة. استخدام svcutil, ، لديك خيار تعيين كل شيء لا يتم تعيينه بشكل صريح مثل هذا (الحل الذي كان جون سوندرز يشير إليه):

svcutil /namespace:*,MyCompany.Services.MyProduct ...

قد تفكر في استخدام:

<NamespaceMappings>
    <NamespaceMapping
        TargetNamespace="*"
        ClrNamespace="MyCompany.Services.MyProduct" />
</NamespaceMappings>

لكن هذه الإرادة ليس العمل ، لأن Visual Studio يضيف ضمنيًا هذا التعيين ، مشيرًا إلى اسم مساحة الاسم التي نحاول التخلص منها. سيؤدي التكوين أعلاه إلى تشتكي Visual Studio من مفتاح مكرر.

مساحات أسماء صريحة:
عندما لا يتم تحديد مساحة اسم Explit في الكود الخاص بك ، فإنه يبدو أن .NET سوف يولد URI من النموذج http://schemas.datacontract.org/2004/07/MyCompany.Services.MyProduct. يمكنك تعيين ذلك وكذلك مساحات الأسماء الواضحة في المثال الخاص بي ، لكنني لا أعرف ما إذا كان هناك أي ضمان لهذا السلوك. لذلك ، قد يكون الذهاب مع مساحة الاسم الصريحة أفضل.

NB: رسم خرائط اثنين من الأسماء المستهدفة لنفس Clrnamespace

نصائح أخرى

كانت حالة استخدامك خاطئة.

يجب ألا تضمن الخدمة أبدًا كمرجع في المقام الأول.

أعتقد أن svcutil.exe سوف يقبل مفتاح تحديد مساحة الاسم الكاملة للاستخدام.

في VS2010 والإصدارات الأحدث ، هناك طريقة لإعداد مساحات أسماء مخصصة. في Solution Explorer ، حدد "إظهار جميع الملفات" ثم افتح "مراجع الويب" في شجرة الحل ، وحدد الخدمة ، وحدد عقدة المرجع.

لسوء الحظ ، ليس لدي سمعة كافية لإظهار لقطة شاشة.

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