簡體   English   中英

具有多個相互依存部分的MEF組成

[英]MEF composition with multiple interdependent parts

設計基於MEF的插件架構且插件之間具有依賴性的最佳方法是什么? 例如:

  class MainForm
  {
    CompositionContainer container;

    [ImportMany]
    IEnumerable<Lazy<IWindow>> windows;

    public MainForm()
    {
      this.container = new CompositionContainer(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
      this.container.ComposeParts(this);
    }

    public void DoSomething()
    {
      foreach (var winPart in windows)
      {
        Debug.WriteLine(winPart.Value.Name);
      }
    }
  }


  interface IWindow
  {
    string Name { get; }
  }

  delegate void AnEvent(object sender, EventArgs e);
  interface IEventManager
  {
    event AnEvent AnEvent;
    void OnAnEvent(object sender, EventArgs eventArgs);
  }

  [Export(typeof(IEventManager))]
  class EventManager : IEventManager
  {
    public event AnEvent AnEvent = delegate { };
    public void OnAnEvent(object sender, EventArgs eventArgs) { AnEvent(sender, eventArgs); }
  }

  [Export(typeof(IWindow))]
  class Window1 : IWindow
  {
    [Import]
    IEventManager eventMgr;

    public Window1() { }

    public string Name
    {
      get
      {
        eventMgr.OnAnEvent(this, new EventArgs());
        return "Window1";
      }
    }
  }

  [Export(typeof(IWindow))]
  class Window2 : IWindow
  {
    [Import]
    IEventManager eventMgr;

    public Window2()  {  this.eventMgr.AnEvent += eventMgr_AnEvent; }

    void eventMgr_AnEvent(object sender, EventArgs e)
    {
      Debug.WriteLine("Event from Window 2");
    }

    public string Name { get { return "Window2"; } }
  }

Window2構造函數中, this.eventMgr為null。 我希望它由MainForm組成。 一種方法是擁有多個CompositionContainers但如果這樣做,則有兩個EventManager實例而不是一個共享實例。 最好的方法是什么?

在進一步探討這個問題時,相互依賴是完全允許的。 關鍵是要使目錄中可用的裝配傳遞到用於構成零件的CompositionContainer。 然后,以下代碼有助於允許一個插件訪問另一個插件:

  [Export(typeof(IWindow))]
  class Window2 : IWindow
  {
    IEventManager eventMgr;

    [ImportingConstructor]
    public Window2([Import(typeof(IEventManager))]IEventManager mgr)
    {
      this.eventMgr.AnEvent += eventMgr_AnEvent;
    }

    void eventMgr_AnEvent(object sender, EventArgs e)
    {
      Debug.WriteLine("Event from Window 2");
    }

    public string Name { get { return "Window2"; } }
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM