بدائل للكلمة الرئيسية التوجيهية "باستخدام" في C#؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

لقد انتهيت للتو من مشاهدة حلقة من Bob Martin في NDC حيث قال إن توجيهات "استخدام" في C# في أعلى الصفحة أمر سيء بسبب الاقتران الضيق الذي تنشئه/تشير إليه ضمنيًا بين المكونات.

ما هي الطريقة المتاحة لاستخدام ملفات .dll الخارجية دون إضافة مرجع للمشروع وبيان الاستخدام؟

أتذكر أن الإصدار 6 كان يسمح لك بإنشاء كائن من خلال سلسلة ProgId - لست متأكدًا من أن هذه هي التقنية التي أبحث عنها، ولكنه مثال للغة لا تحتاج إلى مرجع مشروع لاستخدام dll.

يحرر: هنا رابط للمؤتمر.آسف، ليس لدي الاقتباس الدقيق أو الدقيقة في العرض التقديمي، سأعتمد على الذاكرة.

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

المحلول

إن عبارة الاستخدام ليست سيئة في حد ذاتها - بل إذا حصلت عليها كثيرة جدًا منهم.

بيان مثل using System; نادرًا ما يمثل ذلك مشكلة في حد ذاته، ولكن إذا كان لديك الكثير (أقول أكثر من 3 إلى 6، اعتمادًا على أي منها) في نفس ملف التعليمات البرمجية، فقد يكون ذلك مشكلة إشارة إلى اقتران ضيق.

يمكنك أيضًا تطبيق قاعدة أساسية مماثلة على عدد المراجع في المشروع نفسه.

الحل للاقتران الضيق هو البرمجة إلى واجهات وحقن التبعية (DI).

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

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

نصائح أخرى

وأعتقد أن بوب مارتن يشير في الواقع إلى وقت مبكر مقابل الربط المتأخر.

في. NET في وقت متأخر ملزم من الممكن من خلال التأمل وبشكل أكثر تحديدا الطبقة المنشط الذي يسمح بإنشاء نوع في تجمع خارجي باستخدام اسم الملف أو اسم التجميع.

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

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

واعتقد ان هذا هو السبب بوب يشير إلى هذه الاتهامات بأنها سيئة. الجواب على السؤال "هل هذا سيئة فعلا؟" هو شخصي جدا وسياق واحد يعتمد.

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

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

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

وإلقاء نظرة على الجمعية و AppDomain الطبقات لتحميل الجمعيات، و <لأ href = " http://msdn.microsoft.com/en-us/library/system.activator.aspx "يختلط =" نوفولو noreferrer "> المنشط لخلق نوع من الحالات بالاسم.

هل يمكن استخدام التفكير:

// Load the assembly
Assembly assembly = Assembly.LoadFrom(@"c:\path\Tools.dll");
// Select a type
Type type = assembly.GetType("Tools.Utility");
// invoke a method on this type
type.InvokeMember("SomeMethod", BindingFlags.Static, null, null, new object[0]);

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

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

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