我正在使用棱镜的桌面库。
我想要的是在目录中获取模块,然后运行它们。
我喜欢这样:
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()
答案 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。