动态菜单创建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);
- 是否可以从Autofac容器构建器中删除现有注册?
- 每个匹配生命周期范围的实例,默认情况下?
- Autofac,升级到版本4.0.0缺少ConfigurationSettingsReader
- Autofac,IDisposable和手动呼叫。在某些情况下解决
- Autofac – 无法创建请求生命周期范围,因为HttpContext不可用 – 由于异步代码?
- ASP.NET Autofac Singleton运行两次构造函数注入
- Autofac解决CQRS CommandDispatcher中的依赖关系
- Autofac:如何加载引用但未直接使用的程序集
- .NET 4,AllowPartiallyTrustedCallers属性和SecurityCritical等安全标记