كيفية تحميل الوحدات بشكل ديناميكي في مكتبة التطبيقات Prism/Composite؟

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

سؤال

انا املك فصل في تطبيق Prism/CAL الخاص بي يولد النموذج للمستخدمين لملء البيانات.

يتم تعريف النموذج بواسطة XML ملف مثل هذا:

<area idCode="general" title="General">
    <column>
        <group title="Customer Data">
            <field idCode="title" requiredStatus="true">
                <label>title</label>
                <fieldType>Title</fieldType>
            </field>
            <field idCode="firstName" requiredStatus="true">
                <label>First Name</label>
                <fieldType>Text</fieldType>
            </field>
            <field idCode="lastName" requiredStatus="true">
                <label>Last Name</label>
                <fieldType>Text</fieldType>
            </field>
            <field idCode="email" requiredStatus="true">
                <label>E-Mail</label>
                <fieldType>Email</fieldType>
            </field>
            ...
        </group>
        </column>
    </area>

يحتاج النموذج إلى التحميل محدد الضوابط التي تتوافق مع كل نوع الحقل في XML، على سبيل المثال.

  • عنوان (يظهر قائمة منسدلة:السيد، السيدة، الدكتور، الخ.)
  • نص (مربع نص بسيط)
  • بريد إلكتروني (مربع نص مع التحقق من صحة البريد الإلكتروني)
  • الرمز البريدي (مربع نص مع التحقق من صحة الرمز البريدي)

أريد أن أجعل كل عنصر تحكم وحدة منفصلة يتم تحميلها بحيث على سبيل المثال.ال الرمز البريدي ستكون الوحدة موجودة في دليل الوحدات كملف:

ZipCode.dll

وهو مجرد مربع نص بسيط عنصر تحكم يتم التحقق من صحته استنادًا إلى الرمز البريدي، ولكن يمكن للمطورين إنشاء عنصر تحكم آخر يسمى:

ZipCodePlus.dll

الذي يرث نفس الواجهة ولكنه يوفر محددًا جغرافيًا منبثقًا للرموز البريدية.بمجرد استبدال العميل الرمز البريدي.dll مع ZipCodePlus.dll, ، كل أشكاله سيكون لها هذا جديد وظائف للبحث عن الرموز البريدية.

ومع ذلك، أواجه مشكلة في تصور كيفية تنفيذ ذلك تقنيًا، نظرًا لأن فئة النموذج الخاصة بي تقوم بتحليل XML، فإنها تقوم بإنشاء مثيل للفئات التي توفر وظيفة عناصر التحكم، ولكن من أجل إنشاء مثيل الطبقة، لا بد لي من الحصول على مرجع إليه:

SmartFormFieldZipCodePresenter smartFormFieldEmailPresenter
    = container.Resolve<SmartFormFieldEmailPresenter>();

ولكن كيف يمكنني مثيل ذلك ديناميكيا, ، أي.مع اسم الفصل كـ a خيط, ، وإذا لم تكن هذه الفئة موجودة، فسيتم طرح فئة مناسبة استثناء, ، على سبيل المثال.شيء من هذا القبيل:

كود مزيف:

try {
    var smartFormFieldZipCodePresenter
        = container.Resolve("smartFormFieldZipCodePresenter");
}
catch (ModuleDoesNotExistException) {
    ...
}
هل كانت مفيدة؟

المحلول

يبدو أنك قريب جدًا من الحل الفني لمشكلتك.سأقوم ببساطة بإنشاء واجهة - IZipCodePresenter - وفي بدء تشغيل الوحدة النمطية ZipCode.dll أو ZipCodePlus.dll، قم بتسجيل التنفيذ.

Container.RegisterType<IZipCodePresenter, StandardZipCodePresenter>();

ثم في المحلل اللغوي الخاص بك، قم بحل المثيل مثل:

var zipCodePresenter = container.Resolve<IZipCodePresenter>();

بافتراض عدم تسجيل أي مثيلات للواجهة، سيتم طرح استثناء.وبخلاف ذلك، سوف تحصل على آخر تطبيق ملموس مسجل لـ IZipCodePresenter.لاحظ أنه لن يتم طرح استثناء إلا إذا حاولت تسجيل واجهة.إذا حاولت تسجيل فصل دراسي في Unity، فسيتم إنشاء مثيل بناءً على سياسة Lifetime Manager.

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

Container.RegisterType<IDynamicPresenter, StandardZipCodePresenter>(PresenterName.ZipCodeControl);
Container.RegisterType<IDynamicPresenter, StandardEmailPresenter>(PresenterName.EmailControl);

ومن ثم حلها كما يلي:

var zipCodeControl = Container.Resolve<IDynamicPresenter>(PresenterName.ZipCodeControl);
var emailControl = Container.Resolve<IDynamicPresenter>(PresenterName.EmailControl);

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

أتمنى أن يساعدك هذا!

ملاحظة.هذا يبدو وكأنه فكرة مثيرة للاهتمام ...سأكون مهتمًا بمعرفة كيفية المضي قدمًا في التنفيذ.يمكنك أيضًا المضي قدمًا خطوة أخرى وإنشاء إطار عمل منشئ XAML بالكامل استنادًا إلى بعض المفاهيم الموجودة في ASP.NET MVC.يمكن أن يسهل الاختبار، ولكنه يتمتع بقوة WPF.حظ سعيد!

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