2011-07-01 44 views
1

我有一个Windows服务。这个想法是尽可能多地执行不同的任务。可以说我们有Starter()和Stop()方法的IServicePart接口。当服务启动时,它将搜索某个目录中的所有程序集,并查找实现IServicePart的所有类。完成,没问题。Windows服务+插件设计

问题:

Assembly1.dll是IServicePart一个很好的候选人。但它需要一个配置。例如Assembly1.dll.config。现在我可以将dll复制/粘贴/重命名为task2.dll和task2.dll.config,并为该服务创建第二个任务。每个插件都带有10-20个dll依赖关系

1)最明显的问题是如何加载配置,因为服务主机的appDomain与assembly1和task2不同。

2)我想到的问题,当我尝试时,他们依赖于同一个第三方组件

解决方案1是让一个自定义的配置,而不是使用的app.config来加载两个IServiceParts。

解决方案2将在其自己的appDomain中运行每个插件。

你有什么建议。

希望我解释这个正确

===================

参考:类似的问题在这里:Plugin to use its own app.config

回答

1

的方式我已经做到了这一点,涉及到每个插件都在它自己的应用程序域中。但是,这些应用程序域的代码库属性将继续指向我的服务exe所在的根目录。这实现了两件事:

  1. 插件现在的许多三级依赖不需要重复。例如,我可以将我的记录器程序集放入根文件夹(使用exe文件),所有插件都可以看到它。这很棒,因为我不希望将我的记录器组件放入每个插件子目录,也不希望使用GAC。
  2. 所有插件现在共享相同的应用程序配置(与服务exe使用相同的一个)。这是好事还是坏事,取决于你的需求。但不要忘了configSource属性,它可以让你将特定的配置部分放入你的插件子目录中的单独配置文件中。

    顺便说一句,我一直在使用MAF for my plugins

+0

不错。你能分享一个样本,你如何在新域中运行插件? MAF的早期版本是MEF吗? – mynkow

+0

好吧,先阅读然后问。我知道了! – mynkow

+0

嘿布伦特。如果你有时间可以看看这个:http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/15760b47-1740-4129-9851-79fd506f903a关心! – mynkow