![](/img/trans.png)
[英]MEF composition using ImportMany and existing instances of composable parts
[英]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.