2 Stimmen

Alle Module eines Katalogs (Prism) ausführen

Ich benutze die Desktop-Bibliothek von Prism.

Was ich möchte, ist Module in einem Verzeichnis zu erhalten und sie dann auszuführen.

Ich mache das so:

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

Ich habe überprüft, die Module sind im Katalog geladen. Beispiel für ein Modul:

public class SendEmailClass : IModule
    {
        public void SendEmail()
        {
            MailMessage mail = new MailMessage();
            mail.From = new MailAddress("**", "mich");
            mail.Subject = "Bericht"; //generierten Betreff verwalten

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

            System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient("smtp.gmail.com");
            smtp.Port = 57;
            smtp.EnableSsl = true; //abhängig vom SMTP-Server
            NetworkCredential cred = new NetworkCredential("***", "***");
            smtp.Credentials = cred;
            smtp.Send(mail);
        }

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

Aber dann möchte ich sie ausführen (ihre Initialize() starten), aber ich finde es nicht. Ich möchte den gesamten Katalog ausführen. Hat jemand eine Idee? Ich habe catalog.Initialize(), catalog.Validate() oder catalog.Load() ausprobiert.

2voto

jsmith Punkte 7028

Ihr Code sieht korrekt aus, ich war der Ansicht, dass Sie die Methode GetModuleCatalog() in Ihrer Klasse Bootstrapper überschreiben müssen, um dies zu tun. Hier ist ein funktionierendes Beispiel eines ziemlich einfachen Bootstrapper, der Module aus einem Modulverzeichnis lädt.

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

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

Aktualisierung

Es ist wahrscheinlich möglich, ohne einen Bootstrapper auszukommen und Ihre Module zu laden, aber ich sehe keinen Grund, warum Sie nicht die UnityBootstrapper-Klasse nutzen sollten, sie erledigt die Arbeit für Sie.

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

Ihre Module werden geladen. Ich selbst habe dies noch nie ohne Verwendung des Bootstrappers gemacht, weil es sehr einfach ist.

1voto

Damian Schenkelman Punkte 3487

Wie von jsmith erwähnt, übernimmt der Standard-Bootstrapper den Großteil der Konfiguration, die Sie sonst selbst durchführen müssten. Wenn Sie keine Shell haben, erstellen Sie einfach einen benutzerdefinierten Bootstrapper, der diesen Teil überspringt.

Falls Sie keinesfalls einen Bootstrapper verwenden möchten, können Sie einfach die ModuleManager-Klasse instanziieren, wobei der ModulesCatalog als einer der Parameter übergeben wird, und die Run-Methode des ModuleManagers aufrufen.

Wie bereits erwähnt, übernimmt der Bootstrapper das oben Genannte für Sie. Ich hoffe, das hilft.

Vielen Dank, Damian

0voto

Jordan Punkte 9236

Wie initialisieren Sie Ihre Anwendung im Bootstrap-Modus? Haben Sie eine Bootstrapper-Klasse erstellt? Der Bootstrapper initialisiert alle Ihre Module.

Das ist ein Beispiel für eine von mir erstellte Bootstrapper-Klasse.

public class ApplicationBootstrapper : UnityBootstrapper
{
    // Hier erstellen Sie Ihren Modulkatalog
    protected override IModuleCatalog GetModuleCatalog()
    {
        DirectoryModuleCatalog catalog = new DirectoryModuleCatalog();
        catalog.ModulePath = @"C:\Users\Raph\Documents\Visual Studio 2010\Projects\LibraryLoad\LibraryLoad\Modules";

        return catalog;
    }

    // Hier erstellen Sie Ihre Benutzeroberflächenschale.
    protected override DependencyObject CreateShell()
    {
        Container.RegisterInstance(new ApplicationSettings());

        Shell shell = Container.Resolve();

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

        return shell;
    }

}

Dann führen Sie in Ihrer App.xaml-Datei das OnStartup aus, um Ihren Bootstrapper auszuführen. Dieser wird alle Ihre Module initialisieren.

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

In diesem Beispiel wird der Unity-Bootstrapper verwendet. Alles, was Sie benötigen, ist die Unity-Plattform, die gleichzeitig mit Prism verfügbar ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X