C# 具有多个相互依存部件的MEF组合

C# 具有多个相互依存部件的MEF组合,c#,inversion-of-control,mef,C#,Inversion Of Control,Mef,设计基于MEF的插件体系结构的最佳方法是什么,它在插件之间具有依赖关系?例如: class MainForm { CompositionContainer container; [ImportMany] IEnumerable<Lazy<IWindow>> windows; public MainForm() { this.container = new CompositionContainer(new As

设计基于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"; } }
  }
class主窗体
{
复合容器;
[进口数量]
i数不清的窗户;
公共表格(
{
this.container=新的CompositionContainer(新的AssemblyCatalog(Assembly.getExecutionGassembly());
this.container.ComposeParts(this);
}
公共无效剂量测定法()
{
foreach(windows中的var winPart)
{
Debug.WriteLine(winPart.Value.Name);
}
}
}
接口IWindow
{
字符串名称{get;}
}
委托void AnEvent(对象发送者,事件参数e);
接口IEventManager
{
事件事件;
void OnAnEvent(对象发送方,EventArgs EventArgs);
}
[导出(类型(IEventManager))]
类EventManager:IEventManager
{
公共事件AnEvent AnEvent=委托{};
OnAnEvent(对象发送方,EventArgs EventArgs){AnEvent(发送方,EventArgs);}
}
[导出(类型(IWindow))]
类Window1:IWindow
{
[进口]
IEventManager事件管理器;
公共窗口1(){}
公共字符串名
{
得到
{
eventMgr.OnAnEvent(这是新的EventArgs());
返回“Window1”;
}
}
}
[导出(类型(IWindow))]
类Window2:IWindow
{
[进口]
IEventManager事件管理器;
public Window2(){this.eventMgr.AnEvent+=eventMgr_AnEvent;}
void eventMgr\u AnEvent(对象发送方,事件参数e)
{
Debug.WriteLine(“来自窗口2的事件”);
}
公共字符串名称{get{return“Window2”;}
}

窗口2
构造函数
中,此.eventMgr
为空。我希望它是由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"; } }
  }