动态菜单创建 IoC

Dynamic menu creation IoC

我想知道是否有人知道我如何创建我如何使用 AutoFac 之类的东西让我动态地允许 dll 创建自己的表单和菜单项以在 运行 时间调用它们。

所以如果我有一个,

Employee.dll

Supplier.dll

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

供应商

所以我可以向项目添加一个新的 class 库,它会在加载时将其添加到菜单中。

希望有道理,有人可以帮助我。

干杯

艾丹

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

您必须允许您的外部程序集在您的主应用程序中创建项目条目。为此,您可以在主应用程序中创建一个 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);