سؤال

ولدي 3-الطبقة التطبيق خدمة .NET، الذي يتبع نهج موحد:

Frontend -> Object Model / Business Logic -> Data Access

وأنا أحاول لمعرفة المزيد عن حقن التبعية على طول الطريق، وحتى الآن قد وجدت كبيرة (باستخدام Autofac). كل واحد من 3 طبقات يحتاج إلى خلق مجموعة متنوعة من الأشياء، وأحيانا مع تكوين إضافي / الخ. ويبدو أن حاوية DI ينبغي أن يكون الشيء المثالي لحل هذه، ولكن أواجه بعض المشاكل في الرؤية حيث يجب أن يعيش في علاقة لبقية النظام.

وحاليا لدي فئة في الواجهة الأمامية التي بتكوين حاوية DI. انها اساسا مجموعة كبيرة من التعليمات البرمجية قائلا container.Register<SomeType>() وهلم جرا.

والمشكلة هي أنه تكوين الحاوية لجميع المستويات 3، وبالتالي يجب أن يكون معرفة الغازية إلى حد ما من طبقة الوصول إلى البيانات. وجود التعليمات البرمجية في الواجهة بلدي مع هذه المعرفة يدق ناقوس الخطر في رأسي كنقطة فصل التطبيق إلى مستويات غير لتجنب هذا الوضع بالضبط.
يرصد هذا أسوأ أيضا من حقيقة أن بلدي طبقة الوصول إلى البيانات ليست مجرد خادم SQL كونه دلو البكم من البتات، ولكن تتكون من الكثير من COM معقدة إمكانية التشغيل المتداخل وP / استدعاء المكالمات، لذلك لا بأس لها تأثير على DI التكوين.

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

وسأكون ممتنا حقا إذا كان أي شخص يمكن أن تبادل الخبرات في مجال استخدام DI مع التطبيقات multitiered.

شكرا، أوريون.

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

المحلول

وهذا يعتمد على إذا كان لديك ثلاثة مستويات (الفصل المادي) أو إذا تم نشر جميع طبقات منطقية معا. إذا كانت الواجهة منفصلة عن BL وتتواصل من خلال خدمة ويب أو WCF ثم الواجهة الأمامية والخلفية تحتاج الحاويات الخاصة بها لأنها تقوم بتشغيل في عمليات منفصلة أو آلات منفصلة. إن حاويات تسجيل فقط مكوناته الخاصة واجهات طبقة 'القادمة ".

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

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

Kernel.Register(AllTypes.Pick().FromAssemblyName("DataAccessLayer.dll"));
Kernel.Register(AllTypes.Pick().FromAssemblyName("BusinessLogic.dll"));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top