2015-05-14 184 views
0

我想知道如果有人知道我怎麼可以創建我怎麼可以使用像AutoFac的東西讓我動態允許DLL創建那裏自己的窗體和菜單項在運行時調用它們。動態菜單創建IoC

所以,如果我有一個,

Employee.dll

  • 新的入門表
  • 憑證申請表

Supplier.dll

  • 供應商中的詳細信息
  • 產品形式

在我的winform應用程序會創建一個菜單,這和當每一個點擊負載relavent形式向上

人民

  • 新入門
  • 證書

供應商

  • 供應商詳細
  • 產品

這樣我就可以添加一個新的類庫項目,當它加載了它只是將它添加到菜單。

希望有道理,有人可以幫助我。

乾杯

艾丹

+0

你可能想尋找到MEF。 –

回答

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); 
+0

嗨西里爾,謝謝你的回答我只能說全是天才。 – Aidan

+0

在這種情況下,一個mdiparent會如何工作?所以所有的新形式都是父表單。 – Aidan