你必須做的第一件事情就是讓你的核心應用程序擴展。我們來看一個簡單的例子。
您將不得不允許您的外部程序集在您的主應用程序中創建項目條目。爲此,您可以在主應用程序中創建IMenuBuilder
界面。
public interface IMenuBuilder
{
void BuildMenu(IMenuContainer container);
}
此接口將允許外部組件使用IMenuContainer
創建MenuEntry
。此接口可以定義是這樣的:
public interface IMenuContainer
{
MenuStrip Menu { get; }
}
在主窗體,你將不得不實施IMenuContainer
,並呼籲所有的IMenuBuilder
接口,以支持他們創建菜單項。
public partial class MainForm : Form, IMenuContainer
{
public MenuStrip Menu
{
get
{
return this.mnsMainApp;
}
}
private void MainForm_Load(Object sender, EventArgs e)
{
ILifetimeScope scope = ... // get the Autofac scope
foreach(IMenuBuilder menuBuilder in scope.Resolve<IEnumerable<IMenuBuilder>())
{
menuBuilder.BuildMenu(this);
}
}
}
在每個外部組件,你將必須實現儘可能多的IMenuBuilder
根據需要和一個Autofac模塊。在這個模塊中,您將註冊那些IMenuBuilder
。
public class XXXModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<XXXMenuBuilder>()
.As<IMenuBuilder>();
}
}
最後,在你的核心應用程序,你將必須由外部組件中的所有模塊進行註冊:
ContainerBuilder builder = new ContainerBuilder();
String path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
IEnumerable<Assembly> assemblies = Directory.GetFiles(path, "*.dll")
.Select(Assembly.LoadFrom);
builder.RegisterAssemblyModules(assemblies);
你可能想尋找到MEF。 –