构建热插拔WCF服务库的最佳方法

时间:2009-01-05 00:50:04

标签: .net wcf

我一直在研究一个WCF服务库,希望所有的业务逻辑都能最终生效。我遇到的问题是,有时我必须快速修复服务,为了应用这些修复,我必须停止Windows服务,替换服务DLL,然后重新启动Windows服务。当我们开始将越来越多的逻辑迁移到此层并且必须关闭整个服务以进行任何更改时,这将开始引起额外的麻烦。

我想要做的是创建一个Windows服务的空shell并动态加载和卸载服务。根据需要加载和卸载.Net DLL的最佳方法是什么?或者依靠IIS来提供这种服务会更好吗?

4 个答案:

答案 0 :(得分:8)

如果您使用的是WCF,您需要熟悉的一个名称是Juval Lowy。他是IDesign的创始人,也是WCF最知名的专家之一。强烈推荐他的书 Programming WCF Services

IDesign website提供与WCF相关的一系列免费下载。您所要做的就是提供您的电子邮件地址并遵守IDesign的标准许可协议。

您特别感兴趣的可能是App Domain Host,In-Proc Factory和In-Proc Hosting下载here

答案 1 :(得分:2)

您可以使用反射来动态加载您需要的特定逻辑,但是您的服务的性能影响将是您想要描述的内容。

如果您之前没有使用过反射,这是我从项目中抓取的一个示例。它显示了如何加载程序集并使用一些参数调用方法。

Assembly a = GetAssembly();
Type t = ExportModule.GetExportType(a);
if (t == null) throw new Exception("No proper type found.");

object iExportModule = Activator.CreateInstance(t);
object[] arguments = new object[] { _export.ConnectionString, GetFileName() };

t.InvokeMember("ExecuteExport", BindingFlags.Default | BindingFlags.InvokeMethod,
     null, iExportModule, arguments);

显然我不了解您的环境,但总的来说,我会说更好地关闭服务几分钟来更新软件,而不是将整个范例改为动态。

如果您真的有持续的热修复需要服务降级,我认为您不应该有一个中央服务。你会一直把它拿下来。最好有单独的服务来处理不同的逻辑功能,这样你的整个应用程序就不会被降低(单点故障)。

答案 2 :(得分:1)

将程序集加载到AppDomain后,它将保留在内存中,直到该AppDomain被卸载并销毁。因此,为了模拟“热插拔”环境,您必须设置和拆除将托管实际业务程序集并运行应用程序逻辑的AppDomains(来自主进程'AppDomain)。

毋庸置疑,如果您不断创建/销毁每个WCF服务调用的AppDomain,您应该会期望性能下降。它旨在创建一个与主AppDomain隔离的操作边界,以执行持续有效的有意义的工作。如果你有很多业务逻辑程序集要随时间卸载,那么AppDomains的优点是你可以conserve memory usage

这种动态设置和拆卸的主要示例是ASP.NET。 ASP.NET运行时为每个Web应用程序创建一个AppDomain。如果网站中的内容发生了变化,例如web.config,则会卸载AppDomain,并为新版本的Web应用程序设置新的AppDomain设置 - 应用程序回收。

答案 3 :(得分:0)

尝试使用MEF管理依赖项以及MAF(System.AddIn)来加载/卸载插件。