2011-10-12 69 views
0

我已经依赖于特定组件一些松耦合代码被加载到当前应用程序域:如何强制将特定程序集加载到MVC 2应用程序的每个应用程序域中?

Assembly assembly = AppDomain.CurrentDomain.GetAssemblies().Where(
    candidateAssembly => candidateAssembly.FullName.StartsWith("Microsoft.WindowsAzure.ServiceRuntime")).SingleOrDefault(); 

和代码的MVC 2应用程序和产量内部执行null参考,因为组件没有加载到当前的应用程序域。我只能从该程序集中调用一些代码,但这会在该程序集中引入应用程序代码的强烈依赖性,并且我不再有松耦合。

我需要强制IIS(或任何其他)在我的代码运行之前将该程序集加载到应用程序域中。我试图编写一个IHttpModule的实现并将其列在web.config中,但它没有帮助。

到目前为止,我试图在<system.web><compilation><assemblies>下添加程序集,看起来像是有效,但我不确定它是否可靠。

如何强制将特定程序集加载到应用程序域中而不在代码中引入相关性?

+0

如果您知道它的名称,Assembly.load应该加载程序集。 MEF也有查找和加载程序集的方法AFAIK –

+0

@Simon Halsey:再一次,这是一个很难的依赖,我想要一些不需要更改代码的东西。 – sharptooth

+0

在这种情况下,我也会依赖依赖注入工具。例如,StructureMap支持在特定目录中扫描程序集,这对于这些“拖放”插件要求来说非常合适。 –

回答

0

这是错误的方式,它可能会导致严重的定时错误。

该设置会影响ASP.NET编译,所以它只会在编译ASP.NET视图并且最多编译一次时强制加载程序集 - 无论是对视图的第一个请求还是在就地预编译过程中if后者是设置。无论如何,会有一段时间没有ASP.NET视图需要编译。

现在有29个小时的IIS apppool自动回收。池回收时启动一个新的工作进程,该进程开始托管站点有效负载。重要的是,ASP.NET视图在此过程中不会更改,因此无需重新编译它们,因此不会调用编译过程,因此不会强制加载<system.web><compilation><assemblies>中列出的程序集。

所以这件事看起来工作,直到29小时过去,然后它只是分崩离析。

需要更好的解决方案。类似于<appSettings>中的设置,表示是否可以使用Azure运行时。如果设置已设置,则代码可以在Azure运行时程序集内进行第一次调用,这将使它们加载。如果未设置该设置,则不会尝试调用该代码。

相关问题