复合Web客户端指南

时间:2012-04-03 11:07:04

标签: c# asp.net composite

美好的一天,

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

我正在阅读与以下相关的指导: Composite Web Guidance

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

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

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

2 个答案:

答案 0 :(得分:2)

关于插件类型系统,我已经做了类似的事情,其中​​插件的页面和控件存储在不同的程序集中。

我们最终做的是:

在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或资源文件必须作为嵌入式资源添加到程序集中。您可以通过更改文件的“Build Action”属性来执行此操作:

properties dialogue

代码隐藏将被编译到程序集中,如果您使用共享的bin文件夹,则不需要再执行任何操作。如果不分享这些内容,则必须附加到全局应用中的AssemblyResolveTypeResolve个事件(详情请参阅此here)。

由于存在安全问题,我们最终取消了这个想法,并最终使用MEF数据合同,但如果您的所有其他程序集都是第一方,那么这应该快速而简单。希望这会有所帮助。

答案 1 :(得分:0)

看看DotNetNuke。社区版本非常强大且免费。

1)。 它是一个开源的C#解决方案,没有银光。它确实在客户端使用javascript(但我不认为你的要求是为了排除javascript)

2)。 Dotnetnuke的核心是一个框架,允许开发人员创建插入其中的模块(有可用的初学者项目)。 作为开发人员,您可以在单独的项目中创建模块,将其打包并根据需要进行部署 已经有很多第三方模块可供使用。

3)。 该框架内置了一个用于导出和导入模块的Web界面。

4)。 安装模块后,它会自动放入自己的文件夹中。