复合Web客户端指南

Eli*_*xir 6 c# asp.net composite

美好的一天,

我想知道你是否可以帮助我,

我正在阅读与以下相关的指导: 复合Web指导

我正在阅读标题为"为模块化Web应用程序定义解决方案结构"的部分,特别是"多项目模块"部分.我似乎理解围绕这个的基本概念,但是我似乎无法找到一种合理的方法来允许它在单独的项目中使用我的Web表单.

我知道这里不支持设计时支持masterpages,但我的问题是如何使用Unity(或其他容器)之类的东西来允许我将我的项目(包括web表单页面和代码隐藏文件)部署为完全独立的一个文件夹并将它们插入一个解决方案,指导似乎有点不清楚如何支持这个,每当我尝试导入这些模块时,我得到运行时错误.通过导出控制器,我已经成功地使用了MVC.我很感激你的支持,但我意识到你是一个非常忙碌的人.如果您可以将我链接到博客或资源中详细解释这一点,我将永远是伟大的.感谢您抽出时间来阅读.总结一下,我希望实现以下目标.

  1. 使用asp.net Web表单创建我的Web shell项目(没有silverlight或任何客户端技术)
  2. 创建我自己的项目中存在的模块,这些模块包含我的aspx和aspx代码behing页面以及任何依赖程序集
  3. 我希望这些页面可以通过我的shell导出和导入.
  4. 如果可能的话,我希望我的模块组件在他们自己的文件夹中,以免我的解决方案变得混乱.

luk*_*fer 2

不久前,我对插件类型系统做了类似的事情,其中​​插件位于页面和控件中,但存储在单独的程序集中。

我们最终做的是这样的:

在 Application_Start 上注册自定义 VirtualPathProvider:

void Application_Start(object sender, EventArgs e)
{
    System.Web.Hosting.HostingEnvironment.RegisterVirtualPathProvider(
        new YourCustomVirtualPathProvider());
}
Run Code Online (Sandbox Code Playgroud)

重写 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.
}
Run Code Online (Sandbox Code Playgroud)

现在创建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);
    }
}
Run Code Online (Sandbox Code Playgroud)

您想要以这种方式加载的 ASPX/ASCX 或资源文件必须作为嵌入资源添加到程序集中。您可以通过更改文件的“构建操作”属性来完成此操作:

属性对话

后面的代码将被编译到程序集中,如果您使用共享bin文件夹,则不需要执行任何其他操作。如果它们不被共享,您将必须附加到全局应用程序中的AssemblyResolve和事件(更多信息请参见此处)。TypeResolve

出于安全考虑,我们最终放弃了这个想法,并最终采用了MEF数据合约,但如果所有其他程序集都是第一方,那么这应该是快速而简单的。希望这可以帮助。