كيفية استخدام مففمكروس الإضافات في الروبوت دون تجميع دلل?
سؤال
لدي مشكلة في استخدام بلدي الإضافات مففمكروس في مشروع الروبوت ، لأن PluginLoader
يبدو أن نتوقع .Droid.dll
من مساحة الاسم بالضبط هو في.
لنفترض أن لدي ثلاثة مشاريع مع هذا المجلد وهيكل مساحة الاسم:
MyApp.Core:
Plugins/Settings/ISettings.cs
Plugins/Settings/PluginLoader.cs
MyApp.Droid:
Plugins/Settings/Settings.cs
Plugins/Settings/Plugin.cs
Bootstrap/SettingsPluginBootstrap.cs
MyApp.Touch:
Plugins/Settings/Settings.cs
Plugins/Settings/Plugin.cs
Bootstrap/SettingsPluginBootstrap.cs
يعمل مشروع دائرة الرقابة الداخلية تماما كما هو متوقع ، ويجد البرنامج المساعد دون مشكلة.
مشروع الروبوت من ناحية أخرى ، فشل مع استثناء: Could not load file or assembly 'MyApp.Plugins.Settings.Droid.dll' or one of its dependencies.
إذا قمت بتغيير مساحة الاسم من PluginLoader
من عند MyApp.Core.Plugins.Settings
ببساطة MyApp
, ، يعمل البرنامج المساعد;أعتقد أنه يبحث عن MyApp.dll
ويجد ذلك.ومع ذلك ، إذا كان لدي العديد من المكونات الإضافية في تطبيقي ، فيجب أن يكون لكل منها مساحة اسم خاصة به، ولا يمكن أن تكون جميعها في MyApp
مساحة الاسم.
الحل الوحيد الذي وجدته حاليا هو إنشاء مشروع منفصل لكل مكون إضافي أقوم بإنشائه ، على الرغم من أن هذا يبدو غير ضروري بعض الشيء.
لماذا PluginLoader
الإصرار على البحث عن <PluginLoader namespace>.Droid.dll
ملف على الروبوت ، عندما PluginLoader
على دائرة الرقابة الداخلية يجد البرنامج المساعد دون أي مشكلة?
المحلول
تم تصميم مففمكروس الإضافات للعمل كطبقة أساس التجمع على رأس أوك.
باستخدام نمط مشترك لمساحات الأسماء والتجمعات ، جنبا إلى جنب مع اثنين من الطبقات المساعد (المساعد و بلوجينلوادر) ، الإضافات توفر وسيلة لتبادل وإعادة استخدام مكونات التعليمات البرمجية الأصلية المحمولة.
السبب في دائرة الرقابة الداخلية (وماك) استخدام نظام تحميل البرنامج المساعد مختلفة قليلا لأن مترجم أوت مونوتش لن تسمح ديناميكية Assembly.Load
تحميل.
وبسبب هذا دائرة الرقابة الداخلية لديها لاستخدام نوع مختلف من PluginManager
ونوع مختلف من Bootstrap
الطبقة إلى منصات أخرى.هناك المزيد من المعلومات حول هذا في "كيف يتم تحميل المكونات الإضافية" في https://github.com/MvvmCross/MvvmCross/wiki/MvvmCross-plugins#how-plugins-are-loaded
إذا كنت ترغب في إضافة Loader
اكتب التسجيل المساعد لالروبوت وكذلك دائرة الرقابة الداخلية ، ثم أعتقد أنك يمكن أن تفعل هذا في العرف PluginManager
ويمكن بعد ذلك إنشاء هذا أثناء الإعداد باستخدام تجاوز protected override IMvxPluginManager CreatePluginManager()
.
شيء من هذا القبيل:
public class MyPluginManager : MvxFilePluginManager, IMvxLoaderPluginManager
{
private readonly Dictionary<string, Func<IMvxPlugin>> _finders = new Dictionary<string, Func<IMvxPlugin>>();
public MyPluginManager(string platformDllPostfix, string assemblyExtension = "") : base(platformDllPostfix, assemblyExtension)
{
}
public IDictionary<string, Func<IMvxPlugin>> Finders
{
get { return _finders; }
}
protected override IMvxPlugin FindPlugin(Type toLoad)
{
var pluginName = toLoad.Namespace;
if (string.IsNullOrEmpty(pluginName))
{
throw new MvxException("Invalid plugin type {0}", toLoad);
}
Func<IMvxPlugin> finder;
if (_finders.TryGetValue(pluginName, out finder))
{
return finder();
}
return base.FindPlugin(toLoad);
}
}
تمت تهيئته في الإعداد باستخدام:
protected override IMvxPluginManager CreatePluginManager()
{
return new MyPluginManager(".Droid", ".dll");
}
ثم تحتاج إلى التأكد من أن الخاص بك loader
تستخدم الإضافات القائمة فئات التمهيد القائمة على الخروج من MvxLoaderPluginBootstrapAction
و لا MvxPluginBootstrapAction
كبديل آخر ، إذا لم تكن مهتما بإعادة استخدام المكونات الإضافية بشكل فردي - إذا كنت تفضل عدم شحن الكثير من تجميعات المكونات الإضافية الفردية - فيمكنك وضع جميع الواجهات والتطبيقات في مجموعة واحدة - ويمكنهم بعد ذلك مشاركة واحدة Bootstrap
, Plugin
و PluginLoader
بينهما.
كبديل نهائي ، لاحتياجاتك المخصصة ، يمكنك دائما التفكير في استخدام فئات التمهيد المخصصة الخاصة بك-المعيار Setup
سوف تخلق و Run
أي فئة قابلة للبناء في تجميع واجهة المستخدم الخاص بك والتي تنفذ IMvxBootstrapAction
- حتى تتمكن من استبدال SettingsPluginBootstrap
مع بعض العرف Run
العمل الذي يناسب احتياجات التطبيقات الخاصة بك.
public class SettingsBootstrapAction
: IMvxBootstrapAction
{
public void Run()
{
// my stuff here
}
}