首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复合Web客户端指南

复合Web客户端指南
EN

Stack Overflow用户
提问于 2012-04-03 11:07:04
回答 2查看 473关注 0票数 5

日安,

我在想你能不能帮我,

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

我正在阅读题为“为模块化Web应用程序定义解决方案结构”的部分,特别是“”部分。我似乎理解与此相关的基本概念,但是我似乎无法找到一个合理的方法来允许它在单独的项目中与web forms 一起工作。

我意识到这里将不支持对母版页的设计时支持,但是我的问题是如何使用类似统一(或另一个容器)之类的东西来允许我将我的项目(包括web表单页和文件后面的代码)完全独立地部署到一个文件夹中,并将它们插入解决方案中,指南似乎不清楚如何支持这些模块,每当我试图导入这些模块时,我就会出现运行时错误。我已经通过导出控制器成功地使用了MVC。我会感谢你的支持,但我意识到你是一个非常忙碌的人。如果你能把我和一个博客或资源联系起来,详细地解释一下这一点,我将永远是一个伟大的人。谢谢你抽出时间来读这个。总括而言,我希望达到以下目的。

  1. 使用asp.net web窗体创建我的web项目(没有silverlight或任何客户端技术)
  2. 创建存在于它们自己的项目中的模块,这些模块包含我的aspx和aspx代码,以及任何依赖的程序集。
  3. 我希望这些页面能被我的外壳所输入和出口。
  4. 如果可能的话,我希望我的模块程序集在它们自己的文件夹中,以避免混淆我的解决方案。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-11 02:19:06

一段时间前,我做了一些类似的事情,比如插件类型的系统,其中的插件,页面和控件,但是存储在单独的程序集中。

我们最后做的是:

在VirtualPathProvider上注册一个自定义的Application_Start:

代码语言:javascript
复制
void Application_Start(object sender, EventArgs e)
{
    System.Web.Hosting.HostingEnvironment.RegisterVirtualPathProvider(
        new YourCustomVirtualPathProvider());
}

重写VirtualPathProvider中的必要方法(基于您的逻辑):

代码语言:javascript
复制
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类以从程序集加载文件:

代码语言:javascript
复制
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或资源文件必须作为嵌入式资源添加到程序集中。您可以通过更改文件的"Build“属性来做到这一点:

后面的代码将被编译到程序集中,如果您使用的是共享的bin文件夹,您就不需要再做任何事情了。如果它们不被共享,则必须附加到全局应用程序中的AssemblyResolveTypeResolve事件(更多关于此这里)。

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

票数 2
EN

Stack Overflow用户

发布于 2012-04-07 15:38:48

看看DotNetNuke。社区版是相当有能力和免费的。

1.)这是一个没有silverlight的开源C#解决方案。它确实在客户端使用javascript (但我认为您的需求并不意味着排除javascript)

2.)Dotnetnuke的核心是一个框架,它允许开发人员创建模块(有可用的启动项目),并将其插入其中。作为开发人员,您将在一个单独的项目中创建一个模块,将它们打包并根据需要进行部署。

已经有大量的第三方模块可用。

3.)该框架已经内置了一个用于导出和导入模块的web接口。

4.)当一个模块被安装时,它会自动放置在他们自己的文件夹中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9992009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档