запустить все модули каталога (призмы) - PullRequest
2 голосов
/ 27 сентября 2010

Я использую настольную библиотеку призмы.

я хочу получить модули в каталоге, а затем запустить их.

Мне так нравится:

DirectoryModuleCatalog catalog = new DirectoryModuleCatalog();
catalog.ModulePath = @"C:\Users\Raph\Documents\Visual Studio 2010\Projects\LibraryLoad\LibraryLoad\Modules";

Я проверил, модули загружены в каталог. Пример модуля:

public class SendEmailClass : IModule
    {
        public void SendEmail()
        {
            MailMessage mail = new MailMessage();
            mail.From = new MailAddress("**", "moi");
            mail.Subject = "Report"; //manage generated subject

            mail.To.Add("***");

            System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient("smtp.gmail.com");
            smtp.Port = 57;
            smtp.EnableSsl = true; //depending of the smtp server
            NetworkCredential cred = new NetworkCredential("***", "***");
            smtp.Credentials = cred;
            smtp.Send(mail);
        }

        public void Initialize()
        {
            SendEmail();
        }
    }

Но затем я хочу запустить их (запустить их Initialize ()), но я не нахожу это. Я хочу запустить весь каталог. у кого-то есть идея? Я попробовал catalog.Initialize (), catalog.Validate () или catalog.Load ()

Ответы [ 3 ]

2 голосов
/ 27 сентября 2010

Ваш код выглядит правильно, у меня сложилось впечатление, что вам пришлось переопределить метод GetModuleCatalog() в вашем классе Bootstrapper, чтобы сделать это. Вот рабочий пример довольно простого Bootstrapper, который загружает модули из каталога модулей.

public class Bootstrapper : UnityBootstrapper
{
    private const string MODULE_FOLDER = @".\modules";

    protected override IModuleCatalog GetModuleCatalog()
    {
        DirectoryModuleCatalog catalog = new DirectoryModuleCatalog() { ModulePath = MODULE_FOLDER };
        return catalog;
    }
}

Обновление

Вероятно, можно не использовать загрузчик и загружать ваши модули, но я не понимаю, почему вы не воспользуетесь классом UnityBootstrapper, он работает за вас.

Bootstrapper bootStrapper = new Bootstrapper();
bootStrapper.Run();

Ваши модули будут загружены. Я сам никогда не делал этого без использования загрузчика, потому что это очень просто.

1 голос
/ 27 сентября 2010

Как сказал jsmith, загрузчик по умолчанию обеспечивает большую нагрузку для конфигурации, которую вы в противном случае выполняли бы самостоятельно.Если у вас нет оболочки, просто создайте собственный загрузчик, который пропускает эту часть.

Если вы не хотите использовать загрузчик каким-либо образом, вы можете просто создать экземпляр ModuleManager класс, передавая ModulesCatalog в качестве одного из параметров и вызывая метод ModuleManager Run .

Как я уже говорил, вышеописанное выполняется загрузчиком для вас.Надеюсь, это поможет.

Спасибо, Дамиан

0 голосов
/ 13 января 2011

Как вы загружаете свое приложение?Вы создали класс начальной загрузки?Это загрузчик, который инициализирует все ваши модули.

Это пример класса загрузчика, который я сделал.

public class ApplicationBootstrapper : UnityBootstrapper
{
    // Here is where you create your module catalog
    protected override IModuleCatalog GetModuleCatalog()
    {
        DirectoryModuleCatalog catalog = new DirectoryModuleCatalog();
        catalog.ModulePath = @"C:\Users\Raph\Documents\Visual Studio 2010\Projects\LibraryLoad\LibraryLoad\Modules";

        return catalog;
    }

    // Here is where you create your user interface shell.
    protected override DependencyObject CreateShell()
    {
        Container.RegisterInstance<IApplicationSettings>(new ApplicationSettings());

        Shell shell = Container.Resolve<Shell>();

        if (shell != null)
            shell.Show();

        return shell;
    }

}

Затем в вашем App.xaml файле OnStartup вы запустите загрузчик, и он вызовет инициализацию для всех ваших модулей.

protected override void OnStartup(StartupEventArgs e)
{
    ApplicationBootstrapper bootstrapper = new ApplicationBootstrapper();
    bootstrapper.Run();
}

В этом примере используется загрузчик Unityвсе, что вам нужно, это платформа Unity , которая доступна вместе с Prism .

...