【问题标题】:How to integrate Template published as web applications with the web applications that use this wrapper?如何将作为 Web 应用程序发布的模板与使用此包装器的 Web 应用程序集成?
【发布时间】:2016-12-02 10:02:53
【问题描述】:

我有以下情况:

我目前的项目是这样的:

master pageset of pages.aspx 从母版页继承布局。

现在我想大规模地制作它。所以我想做的是:

two separate web applications(松耦合)发布的两类项目:

  1. wrapper(所有其他网站的主要通用模​​板
    应用程序)替换(相同的母版页
    应用程序),该项目用作这样的框架或模板 :(Header,Footer), [(Sidebar(Menu),Body) dynamic according to the web application which use the wrapper].

  1. 任何 Web 应用程序都会将包装器分为两部分(主体和 菜单)动态。

如何集成包装器和应该使用这个包装器的网络应用程序,并将它们都作为两个单独的网络应用程序发布?


注意:

重点,我不希望对包的每一次更改(包装器) 重新发布所有使用此包的应用程序(包装器) 接受更新。

【问题讨论】:

  • 你能简单介绍一下你想做什么..
  • @Webruster 好吧,如果我想创建一个 Web 应用程序,通常我会在同一个项目中创建一个母版页并使用它。现在我不想这样做,因为我有很多必须使用相同母版页的 Web 应用程序,因此我想重用它并为此主包装器创建一个单独的项目,因此如果我更改此包装器中的某些内容,我不必更改所有使用它的 Web 应用程序和全部发布。简而言之,我想要一个示例来阐明这个想法((包装器与我的问题中的详细信息)和(任何应该使用此包装器的 Web 应用程序)之间的集成。
  • @Webruster : 如果您需要更多详细信息,请告诉我?
  • 不!我也在寻找最好的可行方法!
  • @Webruster:非常感谢

标签: c# asp.net design-patterns architecture software-design


【解决方案1】:

我过去通过使用 NuGet 包解决了这个问题。它们可以像您需要的那样复杂或简单。只需手动创建.nuspec file,使用command line tool 构建它并将其托管在文件系统(本地或网络)上,即可实现基本的母版页布局。

将配置文件添加到模板项目的根目录 - 将其命名为 template.nuspec 并添加以下内容:

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
  <metadata>    
    <id>MyAppTemplate</id>
    <version>1.0.0</version>
    <description>A template web application</description>
    <authors>Me or my company</authors>
  </metadata>  
  <files>
    <file src="Site.Master" target="content\Site.Master" />
    <file src="Site.Master.cs" target="content\Site.Master.cs" />
    <file src="Site.Master.designer.cs" target="content\Site.Master.designer.cs" />
  </files>
</package>

注意目标是“内容”——这会将母版页放在项目根目录中安装 NuGet 包的任何位置。您可能还希望将母版页的命名空间更改为 $rootnamespace$,因为这将执行 source code transformation,这将使母版页成为与项目其余部分相同的命名空间的一部分。

然后您可以从命令行调用nuget.exe pack path\to\nuspec\file

这将导致创建一个.nupkg 文件。对于本地开发,我通常将其放入 C:\NuGet\Local,尽管这可能是网络共享 \\MyShare\InternalNuget,或者如果您想更进一步,也可以使用 ProGetTeamCity 等解决方案。

然后在 Visual Studio 中可以将其添加为包源:

工具 -> NuGet 包管理器 -> 包管理器设置 -> 包源

单击加号并添加您的文件夹/unc 路径/url,然后您可以在任何其他项目中重复使用它。

作为一般规则,最好在创建项目时允许 NuGet 覆盖现有的 Site.Master,然后不要编辑文件,因为这允许您使用 NuGet 包版本控制集中管理更改。但是,如果您确实希望进行项目特定的更改,您可以这样做,您只需要记住不要让 NuGet 包在后续更新中覆盖项目版本。

您可以包含模板项目中的所有类型的文件。这包括.ascx 用户控件、css 和javascript 文件以及已编译或未编译的基本页面(继承自System.Web.UI.Page)。可能性是无止境。使用 &lt;asp:contentplaceholder/&gt; 和适当的 CSS,您可以通过用户控件在大多数项目中使用通用菜单,但仍可以在不修改主模板的情况下将其替换为其他项目中更复杂的菜单。

编辑:

我想可以通过将包装器分成两部分来达到预期的效果(至少对于相对简单的内容)。第一个是包含母版页的 NuGet 包。此母版页可以包含图表中页眉和页脚的 iframe、内容占位符和 css 以及常见样式和 javascript 的脚本标签。

包装器的第二部分将是一个单独的应用程序,托管 iframe 和 .css 和 .js 文件的内容。添加新的 javascript 库等重大更改仍需要更新母版页,但添加新功能或 css 类或更改品牌或徽标等较小更改可以通过更改包装文件并重新发布来完成。有点像托管您自己的简单 CDN。

母版页如下所示:

<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site.master.cs" Inherits="$rootnamespace$.SiteMaster" %>
<html>
<head runat="server">    
    <title><%: Page.Title %></title>    
    <link href="https://example.com/mywrapperapplication/styles/mywrapper.css" rel="stylesheet" />
</head>
<body>
    <iframe src="https://example.com/mywrapperapplication/header.html" />
    <form runat="server">                
        <asp:ContentPlaceHolder ID="MenuContent" runat="server"></asp:ContentPlaceHolder>            
        <asp:ContentPlaceHolder ID="BodyContent" runat="server"></asp:ContentPlaceHolder>
    </form>
    <iframe src="https://example.com/mywrapperapplication/footer.html" />
    <script type="text/javascript" src="https://example.com/mywrapperapplication/scripts/mywrapper.js"></script>
</body>
</html>

然后你在https://example.com/mywrapperapplication 部署了静态内容或简单的应用程序

有 4 个(或更多)文件:

header.html --or aspx or whatever
footer.html
/scripts/mywrapper.js
/styles/mywrapper.css

您对这些文件中的任何一个所做的任何更改都将自动传播到包装的应用程序中,因为它们是从母版页链接的。例如,如果您想添加其他文件,则只需要重新发布打包的应用程序

<link href="https://example.com/mywrapperapplication/styles/mynewstyles.css" rel="stylesheet" />

【讨论】:

  • 能否提供一个简单的例子
  • 这里的主要问题是:如果我在服务器上发布包应用程序,并发布消费网络应用程序。那么我想对包模板进行更改,我不想重新发布我的再次消费应用程序!这就是为什么我想把它们分成项目。你能澄清一下吗?
  • 我不认为有不重新发布它们的解决方案。即使它们是项目,您最终仍然会在您的服务器上部署一个已发布的网站,该网站独立于源。你也许可以用 iframe 做点什么,但即使它能让你摆脱重新部署,我也看不出它是如何让你摆脱对模板的每次更改对每个应用程序进行回归测试的。
  • 这是重点,我不希望对包的每次更改都重新发布所有使用此包进行更新的应用程序。
  • 我建议您的应用程序实际上非常紧密耦合。如果不需要测试对所有子应用程序的影响,您就无法对父应用程序进行重大更改。这正是我第一次开发 NuGet 模板包时遇到的问题,因为为了共享布局、css 和用户控件,它们共享相同的解决方案。
【解决方案2】:

为什么不将使用的应用程序发布为用户控件,并让母版页(您的包装器)以编程方式注入它们,类似于 DotNetNuke 所做的。

https://msdn.microsoft.com/en-us/library/c0az2h86.aspx

用户控件可以单独编译,更改包装时无需重新编译。

【讨论】:

    猜你喜欢
    • 2014-03-28
    • 1970-01-01
    • 2015-05-08
    • 2023-03-09
    • 2011-10-14
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    相关资源
    最近更新 更多