2015-05-14 3 views
0

Мне интересно, может ли кто-нибудь узнать, как я могу создать, как я могу использовать что-то вроде AutoFac, чтобы позволить мне динамически разрешать создание dll собственных форм и элементов меню, чтобы вызвать их во время выполнения.Создание динамического меню IoC

Так что, если у меня есть,

Employee.dll

  • Новая Starter форма Форма
  • Сертификат

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

Смежные вопросы