动态菜单创建IoC

我想知道是否有人在那里知道如何创建我如何使用像AutoFac这样的东西让我动态允许dll创建自己的表单和菜单项来在运行时调用它们。

所以如果我有,

Employee.dll

  • 新的入门表格
  • 证书表格

Supplier.dll

  • 供应商详细信息
  • 产品表格

在我的winform应用程序中,它会创建一个菜单,当每个单击加载相关表单时

  • 新的入门
  • 证书

供应商

  • 供应商详情
  • 制品

所以我可以为项目添加一个新的类库,它只是在加载时将它添加到菜单中。

希望有意义,有人可以帮助我。

干杯

艾丹

您要做的第一件事就是使您的核心应用程序可扩展。 让我们看一个简单的例子。

您必须允许外部程序集在主应用程序中创建项目条目。 为此,您可以在主应用程序中创建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()) { menuBuilder.BuildMenu(this); } } } 

在每个外部assembly中,您必须根据需要实施尽可能多的IMenuBuilder和一个Autofac模块。 在本单元中,您将注册那些IMenuBuilder

 public class XXXModule : Module { protected override void Load(ContainerBuilder builder) { builder.RegisterType() .As(); } } 

最后,在您的核心应用程序中,您必须注册外部程序集提供的所有模块:

 ContainerBuilder builder = new ContainerBuilder(); String path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); IEnumerable assemblies = Directory.GetFiles(path, "*.dll") .Select(Assembly.LoadFrom); builder.RegisterAssemblyModules(assemblies);