动态菜单创建IoC

时间:2015-05-14 15:10:11

标签: c# inversion-of-control autofac ioc-container

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

所以如果我有,

Employee.dll

  • 新入门表格
  • 证书表格

Supplier.dll

  • 供应商详情来自
  • 产品表格

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

  • 新手入门
  • 证书

供应商

  • 供应商详情
  • 产品

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

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

干杯

1 个答案:

答案 0 :(得分:0)

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

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