【问题标题】:Dynamic menu creation IoC动态菜单创建 IoC
【发布时间】:2015-05-14 15:10:11
【问题描述】:

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

如果我有一个,

员工.dll

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

供应商.dll

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

在我的 winform 应用程序中,它会创建一个带有此菜单的菜单,并且当每个人点击时都会加载相关表单

  • 新入门者
  • 证书

供应商

  • 供应商详情
  • 产品

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

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

干杯

艾丹

【问题讨论】:

  • 你可能想看看 MEF。

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


【解决方案1】:

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

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

【讨论】:

  • 嗨西里尔,谢谢你的回答我只能说是天才。
  • mdiparent 在这种情况下如何工作?所以所有的新表单都在父表单中。
猜你喜欢
  • 2015-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-12
相关资源
最近更新 更多