您必须做的第一件事是使您的核心应用程序可扩展。让我们看一个简单的例子。
您必须允许您的外部程序集在您的主应用程序中创建项目条目。为此,您可以在主应用程序中创建一个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);