【问题标题】:Windows service + Plugins designWindows服务+插件设计
【发布时间】:2011-09-27 01:59:48
【问题描述】:

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

问题:

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

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

2) 当两个 IServicePart 依赖于相同的第 3 方程序集时,我预计会出现问题

解决方案 1 是进行自定义配置,而不使用 app.config。

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

你有什么建议。

希望我解释正确

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

参考:类似问题:Plugin to use its own app.config

【问题讨论】:

    标签: c# .net plugins windows-services


    【解决方案1】:

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

    1. 插件现在拥有的许多三级依赖项不需要重复。例如,我可以将我的记录器程序集放在根文件夹中(使用服务 exe),所有插件都可以看到它。这很好,因为我既不想将我的记录器程序集放入每个插件子目录中,也不想使用 GAC。

    2. 所有插件现在共享相同的应用程序配置(服务 exe 使用的相同)。这是好事还是坏事,取决于您的需求。但是不要忘记 configSource 属性,它可以让您将特定的配置部分放入插件子目录中的单独配置文件中。

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

    【讨论】:

    • 不错。您能否分享一个如何在新域中运行插件的示例? MAF 是 MEF 的早期版本吗?
    • 嘿布伦特。如果你有时间可以看看这个:social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/…问候!
    • @mynkow:我不确定这个问题是什么,但我知道您可能会遇到的 MAF 最神秘的问题之一是它的“伪强命名”行为。 MAF 的行为就像每个插件都是强命名的。如果插件的 AssemblyVersion 版本发生变化,并且您没有重置 MAF 插件映射,它会悄悄地不加载插件(版本与预期不匹配)。请注意这一点,您不会有任何问题。
    • 加载插件时应用什么安全性
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多