سؤال

نعمل حاليًا على تطوير قطعة جديدة من البرامج المحمولة باليد.لا أستطيع مناقشة طبيعة التطبيق، لذا سأستخدم مثالاً بدلاً من ذلك.

نحن نصمم برنامجًا محمولًا لإدارة المدرسة.نريد تقسيم كل جانب من جوانب النظام إلى وحدات بحيث تتمكن المدارس المختلفة من استخدام ميزات مختلفة.

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

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

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

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

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

المحلول

لقد كنت في المشاريع التي فعلت ذلك بطريقتين:

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

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

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

نصائح أخرى

وأنا حاليا أيضا على تطوير التطبيقات التي يتم تشغيلها على كل إطار صغير وكامل ويتم بناء وحدات.

والطريق الأول تنفيذه هو أنه يقوم بمسح الموقع لدلل وenummerates على كل نوع، ويتطلع إذا كان لديهم "ScreenInfoAttribute" أو "WidgetInfoAttribute" تعريف الذي يحتوي على معلومات مفيدة حول فئة.

وهنا مقتطف، أنه يحتوي على 3.5 الرمز، ولكن هذا لأننا التي تمت حديثا التحول من 2.0، ولكن أعمال المبدأ في 2.0

public void Analyze(FileInfo file) {
        Assembly asm = Assembly.LoadFrom(file.FullName);
        List<Data.AnyPlugin> types = GetPluginTypes(asm.GetTypes());

        if (types.Count > 0) {
            types.ForEach(x => x.AssemblyPath = file.FullName);
            if (_plugins.ContainsKey(file.FullName)) {
                _plugins[file.FullName].Plugins.AddRange(types);
            } else {
                AssemblyPlugin asp = new AssemblyPlugin();
                asp.Ass = asm;
                asp.Plugins = types;
                _plugins.Add(file.FullName, asp);
            }
        }
    }

    private List<Data.AnyPlugin> GetPluginTypes(Type[] types) {
        List<Data.AnyPlugin> returnTypes = new List<AnyPlugin>();
        foreach (Type t in types) {
            Data.AnyPlugin st = GetPluginType(t);
            if (st != null) returnTypes.Add(st);
        }
        return returnTypes;
    }

    private Data.AnyPlugin GetPluginType(Type type) {
        if (type.IsSubclassOf(typeof(Screens.bScreen<T>))) {
            Screens.ScreenInfoAttribute s = GetScreenAttrib(type);
            if (s != null) {
                return new Data.ScreenPlugin("", type, s);
            }
        } else if (type.IsSubclassOf(typeof(Widgets.bWidget<T>))) {
            Widgets.WidgetInfoAttribute w = GetWidgetAttrib(type);
            if (w != null) return new Data.WidgetPlugin("", type, w);
        }
        return null;
    }

    private Screens.ScreenInfoAttribute GetScreenAttrib(Type t) {
        Attribute a = Attribute.GetCustomAttribute(t, typeof(Screens.ScreenInfoAttribute));
        return (Screens.ScreenInfoAttribute)a;
    }

وأنا لا أعرف ما إذا كان سوف تعمل على CLR لكن إلقاء نظرة على MEF ، لخلق وسيلة لاكتشاف وتحميل الخاص دلس / وحدات. هل يمكن أن يكون أيضا وحدات الخاص بك لديها طريقة GetMenuItem (أو شيء من هذا القبيل من أمثاله) أن يحصل على المعلومات المطلوبة حتى القائمة الرئيسية الخاصة بك يمكن أن تضيف زر واحدة.

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

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

ومجرد السماح لكل وحدة تنفيذ واجهة مشتركة. إضافة طرق مثل GetButtons () أو GetActions ().

ويمكنك بعد ذلك وضع من infomation حول AssemblyName واسم_الفئة في التكوين - الملف. الآن لمن السهل تحميل الجمعية المحدد وإنشاء مثيل من فئة مع Activator.CreateInstance، ويلقي عليه إلى واجهة الخاص بك واستدعاء GetButtons ()، الخ. طرق.

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