ما الاتفاقيات / التعابير / أنماط الذي تستخدمه تكوين اللجنة الاولمبية الدولية الحاويات باستخدام واجهات يجيد جديدة

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

سؤال

وأنا في منتصف تتحرك على مجموعة كبيرة من التعليمات البرمجية إلى قلعة الجذع الذي يتضمن واجهة بطلاقة جديدة لتكوين الحاوية. منذ المشروع يحتوي على ملف xml windsorConfig الكبير الذي هو أبعد للصيانة، ظننت انني سوف تبدأ في الاستفادة من هذه الميزة الجديدة. وأنا أعلم حاويات أخرى (مثل StructureMap 2.0) تحتوي أيضا على واجهات بطلاقة لتكوين الحاويات، لذلك لا يقوم هذا السؤال حول وندسور.

وسؤالي هو ما الاتفاقيات / التعابير / أنماط الذي تستخدمه لتكوين الحاوية باستخدام واجهات جديدة على غرار بطلاقة؟

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

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

وكلما فكرت في ذلك والمزيد من الأسئلة وبدا لي أن يرفع. ما هي أفكارك حول ذلك؟

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

المحلول

ونلقي نظرة أعمق على StructureMap 2.5. ويقدم العديد من الميزات إلى الحد بشكل كبير من العمل الذي ألبس الحذاء الحاوية اللجنة الاولمبية الدولية. ويوفر المؤتمر على تقنية التكوين (انظر مقالات بلوق أدناه)

وانظر بلوق وظائف الأخيرة التالية من جيريمي ميلر (مؤلف StructureMap)

<وأ href = "http://codebetter.com/blogs/jeremy.miller/archive/2009/01/20/create-your-own-auto-registration-convention-with-structuremap.aspx" يختلط = "نوفولو noreferrer"> إنشاء الخاصة اتفاقية التسجيل السيارات الخاصة بك مع StructureMap

        // Example from the blog post above
        var container = new Container(registry =>
        {
            registry.Scan(x =>
            {
                x.TheCallingAssembly();
                x.With<DefaultConventionScanner>();
            });
        });

<وأ href = "http://codebetter.com/blogs/jeremy.miller/archive/2009/01/11/structuremap-2-5-2-is-released.aspx" يختلط = "نوفولو noreferrer" > يتم تحريرها StructureMap 2.5.2

نصائح أخرى

وكان لدي مشروع حيث كنا باستخدام الوحدة، وشاهدت شريط فيديو عن StructureMap وأعجبتني الفكرة التسجيل من البداية.

وهكذا خلقت واجهة التالية:

/// <summary>
/// An interface which must be implemented to create a configurator class for the UnityContainer.
/// </summary>
public interface IUnityContainerConfigurator
{
    /// <summary>
    /// This method will be called to actually configure the container.
    /// </summary>
    /// <param name="destination">The container to configure.</param>
    void Configure(IUnityContainer destination);
}

وديك المجالس توفر فئة تحديد مواصفات الافتراضية. لقد ملفوفة أيضا لدينا الوحدة اللجنة الاولمبية الدولية باستخدام فئة ثابتة بحيث يمكن أن نطلق IoC.Resolve<T>، وأنا فقط واضاف الوظائف التالية لهذا المجمع:

    /// <summary>
    /// Configure the IoC
    /// </summary>
    public static class Configure
    {
        /// <summary>
        /// Configure the IoC using by calling the supplied configurator.
        /// </summary>
        /// <typeparam name="TConfigurator">The configurator to use</typeparam>
        public static void From<TConfigurator>() where TConfigurator : IUnityContainerConfigurator, new()
        {
            From(new TConfigurator());
        }
        /// <summary>
        /// Configure the IoC using by calling the supplied configurator.
        /// </summary>
        /// <param name="configurationInterface">The configurator instance to use</param>
        public static void From(IUnityContainerConfigurator configurationInterface)
        {
            configurationInterface.Configure(instance);
        }
        // other configuration.
    }

وهكذا في شكل التهيئة إما البرنامج أو الموقع أسميه فقط:

IoC.Configure.From<BLL.DefaultMapping>();

في لBLL هناك فئة من هذا القبيل:

public class DefaultMapping:IUnityContainerConfigurator
{
    public void Configure(IUnityContainer destination)
    {
        destionation.RegisterType<IRepository, SQLRepository>();
        // and more..
    }
}

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

على تحديث : في منذ هذه الإجابة لقد نشرت مقالا عن بلدي بلوق التي تحتوي في الوحدة المجمع .

والأسئلة صعب [وأنا لست خبيرا اللجنة الاولمبية الدولية] ولكن نأخذ في الاعتبار أن أي "وظيفة ثابتة متجانسة" لا ينبغي أن يكون <م> تقريبا كما مخيفة مثل ملف التكوين. يمكنك تحديد الاتفاقيات الخاصة للأشياء، ومحاولة أشياء مجردة إلى أسفل. يمكنني استخدام Ninject، ولكن لوندسور، وأنا أتصور أنه ينطوي على جعل وظائف صغيرة قصيرة باستخدام أشياء مثل التسجيل مع استراتيجية AllTypesOf:

kernel.Register(AllTypesOf<ISomethingProvider>.
    FromAssembly(Assembly.Load("SomeAssembly")));

لا أعرف عن التسلسلات الهرمية الداخلية تصدير التكوين الافتراضي الخاص بهم. الذي يبدو قليلا مخيف والمقلوب.

هل يمكن أن محاولة دراسة الإطار Ninject. بسيطة جدا، واجهة بطلاقة وبسرعة البرق؛) أي تكوين XML وAPI بسيطة للغاية. موصى به للغاية

Ninject

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