سؤال

باستخدام MEF أريد أن أفعل ما يلي.

لدي قذيفة WPF.إلى الغلاف أريد استيراد UserControl من DLL آخر وهو أيضًا عرض لثالوث MVP الخاص بي.الطريقة التي يعمل بها ثالوث MVP، هي أنه في مقدم العرض لدي مُنشئ يأخذ كلاً من IModel وIView ويقوم بتوصيلهما.لذا، لكي ينجح هذا، أحتاج إلى MEF للقيام بما يلي:

  1. إنشاء تنفيذ IView
  2. إنشاء تنفيذ IModel
  3. أنشئ مقدمًا وقم بتمرير IModel وIView إلى مُنشئه
  4. قم باستيراد تطبيق IView إلى Shell الخاص بي عندما يتم عرضه

بدلاً من ذلك، ما يفعله هو أنه ينشئ فقط النوع Exporting IView ويمرره إلى الصدفة، ويتخطى الخطوتين 2 و3 بشكل أساسي.إنه أمر منطقي جدًا، عندما تفكر في الأمر، ولكن كيف يمكنني أن أخبر MEF أيضًا بإنشاء الثالوث بأكمله عندما أطلب IView.لا أحتاج إلى الإشارة إلى Presenter أو النموذج في أي مكان آخر في ملف Shell .dll الخاص بي، لذا فإن وضعه كاستيراد أيضًا ليس خيارًا (وسيكون قبيحًا جدًا على أي حال :)).

أنا أستخدم أحدث قطرة من MEF (تحديث المعاينة 2).أي واحد؟

==تحديث==

لقد وجدت الحل وقمت بالتدوين عنه هنا:
مدونة Krzysztof Koźmic - إنشاء شجرة من التبعيات باستخدام MEF

ومع ذلك، سأكون سعيدًا جدًا إذا توصل أحد الأشخاص إلى حل أفضل.**

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

المحلول

تحقق من إجابتي هنا.

http://codebetter.com/blogs/glenn.block/archive/2008/11/12/mvp-with-mef.aspx

يحرر:(تمت الإضافة من الرابط، لمنع عدم وضع علامة على الجودة المنخفضة / LOA)

   1: using System.ComponentModel.Composition;
   2: using System.Reflection;
   3: using Microsoft.VisualStudio.TestTools.UnitTesting;
   4:  
   5: namespace MVPwithMEF
   6: {
   7:     /// <summary>
   8:     /// Summary description for MVPTriadFixture
   9:     /// </summary>
  10:     [TestClass]
  11:     public class MVPTriadFixture
  12:     {
  13:         [TestMethod]
  14:         public void MVPTriadShouldBeProperlyBuilt()
  15:         {
  16:             var catalog = new AttributedAssemblyPartCatalog(Assembly.GetExecutingAssembly());
  17:             var container = new CompositionContainer(catalog.CreateResolver());
  18:             var shell = container.GetExportedObject<Shell>();
  19:             Assert.IsNotNull(shell);
  20:             Assert.IsNotNull(shell.Presenter);
  21:             Assert.IsNotNull(shell.Presenter.View);
  22:             Assert.IsNotNull(shell.Presenter.Model);
  23:         }
  24:     }
  25:  
  26:     [Export]
  27:     public class Shell
  28:     {
  29:         private IPresenter _presenter = null;
  30:         
  31:         public IPresenter Presenter
  32:         {
  33:             get { return _presenter; }
  34:         }
  35:  
  36:         [ImportingConstructor]
  37:         public Shell(IPresenter presenter)
  38:         {
  39:             _presenter = presenter;
  40:         }
  41:     }
  42:  
  43:     public interface IModel
  44:     {
  45:     }
  46:  
  47:     [Export(typeof(IModel))]
  48:     public class Model : IModel
  49:     {
  50:         
  51:     }
  52:  
  53:     public interface IView
  54:     {
  55:     }
  56:  
  57:     [Export(typeof(IView))]
  58:     public class View : IView
  59:     {
  60:     }
  61:  
  62:     public interface IPresenter
  63:     {
  64:         IView View { get;}
  65:         IModel Model { get; }
  66:     }
  67:  
  68:     [Export(typeof(IPresenter))]
  69:     public class Presenter : IPresenter
  70:     {
  71:  
  72:         private IView _view;
  73:         private IModel _model;
  74:  
  75:         [ImportingConstructor]
  76:         public Presenter(IView view, IModel model)
  77:         {
  78:             _view = view;
  79:             _model = model;
  80:         }
  81:  
  82:         public IView View
  83:         {
  84:             get { return _view; }
  85:         }
  86:  
  87:         public IModel Model
  88:         {
  89:             get { return _model; }
  90:         }
  91:  
  92:     }
  93: }

إذن ما الذي يحدث هنا؟

يتم حقن Shell مع مقدم العرض.يتم حقن مقدم العرض بالعرض والنموذج.كل شيء هنا منفرد، لكن ليس من الضروري أن يكون كذلك.

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

نصائح أخرى

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

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

لدي تدوينة تحتوي على مثالين يوضحان طريقة التفكير هذه:

http://www.sidarok.com/web/blog/content/2008/09/26/what-is-this-managed-extensibility-framework-thing-all-about.html

أيضًا، لإسقاط ملف dll ومشاهدة الأنواع الموجودة فيه، يمكنك استخدام DirectoryPartCatalog لمشاهدة هذا المجلد.

ستحتاج أيضًا إلى مراقبة السيناريوهات التي توجد فيها عمليات تصدير متعددة لنفس العقد، وتحديد السيناريو الصحيح من البيانات الوصفية المقدمة.

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