1

我试图确定MEF是否是我们的应用程序框架应该采取的正确方向。从我对MEF的阅读中,我们的框架似乎并不完全适合,但我会看看是否有专家可以指导我。是我的MEF吗? (一个允许客户端应用程序插入的核心应用程序)

我们的框架允许我们将一个核心网站和相关程序集部署到一个地方(修复程序或功能向所有客户端传播),然后我们将客户端网站“合并”到核心网站并将其扩展需要的地方。

现在在IIS中,每个客户端站点都是它自己的AppDomain中运行的应用程序。但是,每个应用程序都有相同的物理路径指向“核心网站”。

所以我们的文件结构...

  • /CoreSite
    • /箱(含核心站点和依赖的DLL)
    • /[核心站点文件夹(如模型,视图Controlers,内容等)
    • /客户
      • /_Assemblies(包含所有客户端assemblie秒 - 客户100S)
      • /客户端1
        • /[客户端站点文件夹(例如模型,视图,控制器等)
      • /客户机2
        • /[客户端站点文件夹(例如模型,视图,控制器等)
      • /ClientN

所以你可能已经猜到,集加载是我们的问题。出于几个原因,我们不希望将所有客户端程序集都放入root/bin文件夹中。首先,我们不希望每个客户端站点都加载其他客户端程序集。其次,我们不希望每个站点的AppDomain都被回收,因为其他客户端的程序集已在/ bin文件夹中更新。

为了使这项工作在asp.net 1.1中,我们遵循http://www.hanselman.com/blog/MovingTheCodeBehindAssembliesDLLsToADifferentFolderThanBINWithASPNET11.aspx,并且增加了<探测privatePath =;与<%@大会名称=“ClientN沿着 ”箱子客户端/ _Assemblies“/>元素在web.config “%>指令在客户端站点的每个视图中。我们唯一需要克服的其他问题是更新客户端程序集,但是asp.net 1.1会将程序集锁定在/ Clients/_Assemblies目录中。我们简单地说:

if (Directory.Exists(assembliesDir) && AppDomain.CurrentDomain.SetupInformation.ShadowCopyDirectories.IndexOf(assembliesDir) < 0) 
{ 
    AppDomain.CurrentDomain.SetShadowCopyPath(AppDomain.CurrentDomain.SetupInformation.ShadowCopyDirectories + ";" + assembliesDir); 
} 

和中提琴,一切似乎像一个魅力工作。不幸的是,在asp.net 4.0中,AppDomain.CurrentDomain.SetShadowCopyPath()已被弃用。所以我们一直在尝试从字节数组中加载程序集,试图使用AssemblyResolve事件,在[assembly:PreApplicationStartMethod(typeof(MvcApplication),“PreApplicationStart”)]中尝试过使用System。 Compilation.BuildManager.AddReferencedAssembly无济于事。

我们要么得到: - 没有装配装 - 装太多组件,或 - 该组件被加载,但是当一个观点是渲染和遇到<导入/>指令,其中的命名空间应该已经距离<% @ Assembly Name =“ClientN”%>简单地失败。

所以我要求任何建议使用任何机制和/或建议是否MEF是要走的路。我的1000英尺视角是MEF更多地面向1个应用程序(或网站),它有几个组件插入它。我很犹豫开始了一个主要的代码重构(看起来),因为在我们的情况下,我们只有每个应用程序/应用程序域一次插入一个组件。它似乎也比我们需要的做得更多(只需加载程序集并让asp.net识别它;然后我们所有的代码都可以工作)。

任何意见非常感谢。

回答

0

它看起来像你需要做的是弄清楚如何为所有你有程序集的文件夹启用影子复制。你使用的方法的原因是不推荐的,因为你真的需要在AppDomain之前设置它被建造。所以我的猜测是可能需要在web.config中设置以启用此功能。

MEF可能或可能不适合您的应用程序,但它不会解决影子复制问题。

0

根据文档,从.NET 2.0开始,行为发生了变化。 通过探测(包括私人路径)发现的所有程序集都会自动受到影子复制(因为它为应用程序域启用),并且方法具有相反的目标 - 它会将范围缩小为影子复制路径。

默认情况下,影子副本包括通过探测找到的所有程序集。 SetShadowCopyPath方法将阴影副本限制在由路径指定的目录中的程序集。

SetShadowCopyPath方法未指定要搜索程序集的其他目录。要进行阴影复制的组件必须已经位于搜索路径中,例如在BaseDirectory之下。方法SetShadowCopyPath指定哪些搜索路径有资格进行影子复制。