运行目录的所有模块(棱镜)

时间:2010-09-27 15:41:12

标签: wpf module prism modularity

我正在使用棱镜的桌面库。

我想要的是在目录中获取模块,然后运行它们。

我喜欢这样:

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 个答案:

答案 0 :(得分:2)

您的代码看起来是正确的,我认为您必须覆盖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 :(得分:1)

正如jsmith所说,默认的引导程序为您自己执行的配置提供了繁重的工作。如果您没有Shell,只需创建一个跳过该部分的自定义引导程序。

如果您不想以任何方式使用引导程序,您可以实例化ModuleManager类,将ModulesCatalog作为其中一个参数传递,并调用ModuleManager的Run方法。 / p>

正如我之前所说,以上是由引导程序为您完成的。 我希望这会有所帮助。

谢谢, 达米安

答案 2 :(得分:0)

你是如何引导你的应用程序的?你创建了一个bootstrapper类吗?引导程序是初始化所有模块的。

这是我制作的bootstrapper类的一个例子。

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 platform并排使用的Prism