我想知道是否有人知道如何创建我如何使用像AutoFac这样的东西让我动态允许dll创建自己的表单和菜单项以在运行时调用它们。
所以如果我有,
Employee.dll
Supplier.dll
在我的winform应用程序中,它会创建一个菜单,当每个单击加载相关表格时
人
供应商
所以我可以在项目中添加一个新的类库,它会在加载时将它添加到菜单中。
希望有意义,有人可以帮助我。
干杯
艾
答案 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);