wpf - 运行目录的所有模块( Prism )

标签 wpf module prism modularity

我正在使用 prism 的桌面库。

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

我确实喜欢这样:

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()

最佳答案

您的代码看起来正确,我的印象是您必须重写 Bootstrapper 类中的 GetModuleCatalog() 方法才能执行此操作。这是一个非常简单的 Bootstrapper 的工作示例,它从模块目录加载模块。

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

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

更新

可能可以不使用 Bootstrap 并加载模块,但我不明白为什么您不利用 UnityBootstrapper 类,它会为您完成工作。

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

您的模块将被加载。我自己从来没有在不使用 Bootstrap 的情况下这样做过,因为它非常简单。

关于wpf - 运行目录的所有模块( Prism ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3805420/

相关文章:

c# - 使用另一个类的 EventAggregator 在 Window 的 ViewModel 中刷新属性

wpf - 如何对 PRISM CompositePresentationEvent 的发布者调用回调操作?

WPF 触发 VS Converter

wpf - Mahapps.Metro 单控件更改主题

python - 将信息传递给导入的 Python 模块

rust - 为什么 Rust 认为我的私有(private)类型必须是公共(public)的,除非我使用 pub(crate)?

c# - 事件不会跨模块触发(prism、MVVM、silverlight c#)

c# - 使用 GetLineStartPosition 获取 WPF RichTextBox 中一行的结尾

c# - 在从 XAML 实例化的控件中使用 MEF

Python - 从类 __init__ 方法调用函数时未定义全局名称