你好,
我想知道你是否可以帮助我,
我正在阅读与以下内容相关的指南: Composite Web Guidance
我正在阅读标题为“为模块化 Web 应用程序定义解决方案结构”的部分,特别是“多项目模块”部分。我似乎理解与此相关的基本概念,但是我似乎无法找到一种合理的方法来让它在单独的项目中与我的网络表单一起使用。
我意识到这里不支持母版页的设计时支持,但是我的问题是如何使用 unity(或另一个容器)之类的东西来允许我部署我的项目(包括 Web 表单页面和代码隐藏文件)作为完全独立到一个文件夹中并将它们插入到解决方案中,关于如何支持这一点的指导似乎有点不清楚,每当我尝试导入这些模块时,我都会遇到运行时错误。通过导出 Controller ,我已经成功地使用了 MVC。感谢您的支持,但我知道您是一个非常忙碌的人。如果您可以将我链接到详细解释这一点的博客或资源,我将永远感激不已。感谢您抽出时间来阅读。总而言之,我希望实现以下目标。
- 使用 asp.net web 表单创建我的 web shell 项目(没有 silverlight 或任何客户端技术)
- 创建我的模块,这些模块存在于他们自己的项目中,其中包含我的 aspx 和 aspx 代码隐藏页面以及任何依赖程序集
- 我希望我的 shell 可以导出和导入这些页面。
- 如果可能的话,我希望我的模块程序集位于它们自己的文件夹中,以免混淆我的解决方案。
最佳答案
不久前,我在插件类型系统中做过类似的事情,其中页面和控件所在的插件存储在单独的程序集中。
我们最终做的是这样的:
在 Application_Start 上注册自定义 VirtualPathProvider:
void Application_Start(object sender, EventArgs e)
{
System.Web.Hosting.HostingEnvironment.RegisterVirtualPathProvider(
new YourCustomVirtualPathProvider());
}
覆盖 VirtualPathProvider 中的必要方法(根据您的逻辑):
public class YourCustomVirtualPathProvider : System.Web.Hosting.VirtualPathProvider
{
private const string RESERVED_PATH = "/components/external";
public override bool FileExists(string virtualPath)
{
if (virtualPath.StartsWith(RESERVED_PATH))
return true;
else
return base.FileExists(virtualPath);
}
public override VirtualFile GetFile(string virtualPath)
{
if (virtualPath.StartsWith(RESERVED_PATH))
return new MyCustomVirtualFile(virtualPath);
else
return base.GetFile(virtualPath);
}
//You'll also need to override methods for directories, omitted for brevity.
}
现在创建 MyCustomVirtualFile
类以从程序集中加载文件:
public class MyCustomVirtualFile : System.Web.Hosting.VirtualFile
{
private string _virtualPath;
public MyCustomVirtualFile(string virtualPath) { _virtualPath = virtualPath }
public override System.IO.Stream Open()
{
//You'll need some method to tie a virtual path to an assembly
//Then load the file from the assembly and return as a Stream
Assembly assembly = Foo.GetAssemblyByVirtualPath(_virtualPath);
string fileName = Foo.GetFileNameFromVirtualPath(_virtualPath);
return assembly.GetManifestresourceStream(fileName);
}
}
要以这种方式加载的 ASPX/ASCX 或资源文件必须作为嵌入资源添加到程序集中。您可以通过更改文件的“构建操作”属性来执行此操作:
后面的代码将被编译到程序集中,如果您使用的是共享的 bin
文件夹,则无需执行任何其他操作。如果它们不被共享,您将必须附加到全局应用程序中的 AssemblyResolve
和 TypeResolve
事件(更多关于此 here)。
出于安全考虑,我们最终放弃了这个想法,并最终选择了MEF。数据契约(Contract),但如果您所有其他程序集都是第一方,那么这应该是快速和容易的。希望这会有所帮助。
关于c# - 复合 Web 客户端指南,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9992009/