动态菜单创建 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);
我想知道是否有人知道我如何创建我如何使用 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);