1

我正在尝试确定 MEF 是否是我们的应用程序框架应该采用的正确方向。从我对 MEF 的阅读来看,我们的框架似乎并不“完全”适合,但我会看看是否有专家可以指导我。

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

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

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

  • /核心站点
    • /bin(包含核心站点和依赖 dll)
    • /[核心站点文件夹](例如模型、视图、控制器、内容等)
    • /客户
      • /_Assemblies(包含所有客户端程序集 - 100 个客户端)
      • /客户1
        • /[客户端站点文件夹](例如模型、视图、控制器等)
      • /客户2
        • /[客户端站点文件夹](例如模型、视图、控制器等)
      • /客户N

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

为了在 asp.net 1.1 中进行这项工作,我们遵循http://www.hanselman.com/blog/MovingTheCodeBehindAssembliesDLLsToADifferentFolderThanBINWithASPNET11.aspx并在 web.config 中添加了 <probing privatePath="bin;Clients/_Assemblies"/> 元素在客户端站点的每个视图中使用 <%@ Assembly Name="ClientN" %> 指令。我们必须克服的唯一其他问题是更新客户端程序集,但 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" 定位的 <Import/> 指令%> 只是失败了。

因此,我要求使用任何机制和/或关于 MEF 是否可行的建议提出任何建议。我的 1000 英尺观点是,MEF 更适合 1 个应用程序(和/或网站),其中插入了多个组件。我犹豫是否开始进行主要的代码重构(似乎),因为在我们的情况下,每个应用程序/应用程序域一次只有一个组件插入其中。它似乎也比我们需要它做的更多(只需加载程序集并让 asp.net 识别它......然后我们所有的代码都会工作)。

任何意见是极大的赞赏。

4

2 回答 2

0

看起来您需要做的是弄清楚如何为您拥有程序集的所有文件夹启用卷影复制。不推荐使用您使用的方法的原因是因为您确实需要在创建 AppDomain 之前设置它。所以我的猜测是你可能需要在你的 web.config 中设置一些东西来启用它。

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

于 2010-07-08T01:16:24.907 回答
0

根据文档,自 .NET 2.0 以来,行为发生了变化。通过探测找到的所有程序集(包括私有路径)都会自动进行卷影复制(因为它已为应用程序域启用),并且SetShadowCopyPath方法具有相反的目标 - 它缩小了卷影复制路径。

默认情况下,卷影副本包括通过探测找到的所有程序集。SetShadowCopyPath方法将卷影副本限制为 path 指定的目录中的程序

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

于 2011-07-15T13:02:54.297 回答