Any*_*are 6 c# architecture asp.net design-patterns software-design
我有以下情况:
我目前的项目是这样的:
A master page
并set of pages.aspx
从母版页继承布局.
现在我想大规模地制作它.所以我想做的是:
两种类型的项目发布为two separate web applications
(松散耦合):
(Header,Footer)
,[(Sidebar(Menu),Body) dynamic according to the
web application which use the wrapper]
.如何集成应该使用此包装器的包装器和Web应用程序,并将它们作为两个单独的Web应用程序发布?
注意:
重点是,我不希望对包(包装器)的每次更改都重新发布使用此包(包装器)的所有应用程序来进行更新.
我过去使用 NuGet 包解决了这个问题。它们可以像您需要的那样复杂或简单。只需手动创建.nuspec 文件、使用命令行工具构建它并将其托管在文件系统(本地或网络)上,即可实现基本的母版页布局。
将配置文件添加到模板项目的根目录 - 将其命名为 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>
Run Code Online (Sandbox Code Playgroud)
请注意,目标是“内容” - 这会将母版页放置在安装 NuGet 包的项目根目录中。您可能还希望将母版页的命名空间更改为,$rootnamespace$
因为这将执行源代码转换,使母版页成为与项目的其余部分相同的命名空间的一部分。
然后您可以从命令行调用 nuget.exe pack path\to\nuspec\file
这将导致.nupkg
创建一个文件。对于本地开发,我通常将其放在 中C:\NuGet\Local
,尽管这可能是网络共享,或者如果您想进一步发展,也可以使用ProGet或TeamCity\\MyShare\InternalNuget
等解决方案。
然后在 Visual Studio 中您可以将其添加为包源:
工具 -> NuGet 包管理器 -> 包管理器设置 -> 包源
单击加号并添加您的文件夹/unc 路径/url,然后您可以在任何其他项目中重用它。
作为一般规则,最好在创建项目时允许 NuGet 覆盖现有 Site.Master,然后不要编辑文件,因为这允许您使用 NuGet 包版本控制集中管理更改。但是,如果您确实希望进行特定于项目的更改,您可以这样做,只需记住不要让 NuGet 包在后续更新中覆盖项目版本。
您可以包含模板项目中的所有类型的文件。这包括.ascx
用户控件、css 和 javascript 文件以及已编译或未编译的基页(继承自System.Web.UI.Page
)。可能性是无止境。使用<asp:contentplaceholder/>
适当的 CSS,您可以通过用户控件在大多数项目中使用通用菜单,但仍然可以在其他项目中用它替换更复杂的菜单,而无需修改主模板。
编辑:
我想通过将包装器分成两部分可以达到预期的效果(至少对于相对简单的内容)。第一个是包含母版页的 NuGet 包。该母版页可以包含图表中页眉和页脚的 iframe、内容占位符以及常见样式和 JavaScript 的 css 和脚本标记。
包装器的第二部分是一个单独的应用程序,托管 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>
Run Code Online (Sandbox Code Playgroud)
然后你有静态内容或简单的应用程序部署在https://example.com/mywrapperapplication
有 4 个(或更多)文件:
header.html --or aspx or whatever
footer.html
/scripts/mywrapper.js
/styles/mywrapper.css
Run Code Online (Sandbox Code Playgroud)
您对这些文件中的任何一个进行的任何更改都将自动传播到包装的应用程序中,因为它们是从母版页链接的。例如,如果您想添加其他文件,则只需重新发布打包的应用程序
<link href="https://example.com/mywrapperapplication/styles/mynewstyles.css" rel="stylesheet" />
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
176 次 |
最近记录: |