【问题标题】:Suggestions In Porting ASP.NET to MVC.NET - Is storing SiteConfiguration in Cache RESTful? [closed]将 ASP.NET 移植到 MVC.NET 的建议 - 将 SiteConfiguration 存储在缓存 RESTful 中吗? [关闭]
【发布时间】:2011-02-12 14:55:41
【问题描述】:

我的任务是将我们拥有的 Web 应用程序平台从 ASP.NET 移植/重构到 MVC.NET。理想情况下,我可以使用所有现有平台的配置来确定所呈现网站的属性。

System.Web.Caching.Cache 中保留一个包含我们所有各种页面配置数据的 SiteConfiguration 对象是否是 RESTful?当用户访问我们的网站时需要加载很多设置,因此每个用户每次访问时都必须加载相同的设置是低效的。

SiteConfiguration 对象包含的一些数据如下,它决定了哪些母版页/站点配置/样式/用户控件可供客户端使用,

public string SiteTheme { get; set; }
public string Region { private get; set; }
public string DateFormat { get; set; }
public string NumberFormat { get; set; }
public int WrapperType { private get; set; }
public string LabelFileName { get; set; }
public LabelFile LabelFile { get; set; }

// the following two are the heavy ones
// PageConfiguration contains lots of configuration data for each panel on the page
public IList<PageConfiguration> Pages { get; set; }

// This contains all the configurations for the factsheets we produce
public List<ConfiguredFactsheet> ConfiguredFactsheets { get; set; }

我想有一个这样的 URL 结构:

www.MySite1.com/PageTemplate/UserControl/

域决定了创建的 SiteConfiguration 对象,其中 MySite1.com 是 SiteId = 1,MySite2.com 是 SiteId = 2。(反过来,各种页面的样式、配置等)

PageTemplate 是将要呈现的视图,它只是定义了我将要注入 UserControls 的布局

如果我完全错过了这里的 RESTful 点,有人可以告诉我吗?我想将平台重构为 MVC,因为它更好地工作,但我想把它做对,但最少要重新发明轮子,否则它不会得到批准。有其他建议吗?

编辑:区域?" 使用 ASP.NET MVC 2 区域是否可行,其中每个区域代表一个不同的站点,包含 css、javascript 等?

【问题讨论】:

  • 在 github 中是否有关于它的完整示例(ASP.NET WeForms 和 ASP.NET MVC)?

标签: asp.net asp.net-mvc architecture rest


【解决方案1】:

我同意接受的答案。因为这个答案没有明确地回答你关于是否是 RESTful 的问题,所以我想添加一些关于 (1) 的内容。还请回答您关于区域 (2) 的问题。

0。 MVC.NET?

但首先我想说的是,对于MVC.NET,官方名称是ASP.NET MVC。对于ASP.Net,您可能是指ASP.NET Webforms。完整的术语更清楚地表明 MVC 仍然只是 ASP.NET 的扩展。那么,如果您愿意的话,您还可以在同一个项目中混合和匹配 MVC 视图和“旧”.aspxpages 也就不足为奇了。这可以是一种将项目从 WebForms 移植到 MVC 的简单方法,方法是允许在一段时间内逐步迁移内容并在那里获取新内容,例如敏捷的方式。请注意随时更新用户/SEO 的路由/URL)。

1。使用缓存

使用缓存进行每个域的自定义确实是 RESTful 的。我假设您主要对真正的RESTful 服务的“无状态”属性有疑问。仅当您还使用 SiteConfiguration 对象进行了按用户自定义时,您才会违反这一点。当每个域的配置只有不同的变化时,状态/配置被封装在 URL(例如域名)中,因此状态/配置在用户之间来回传输,而您的服务本身是无状态的。

根据this SO article,还使用.NET 的Cache 对象而不是Application 对象之类的替代对象具有一些优势。

然而,我个人不喜欢将缓存用于基本的架构事物,因为它是无类型的。所以你必须从缓存中投射所有东西。我在这里吹毛求疵,因为你只有一个大的配置对象,所以这只需要做一次,而且里面的所有东西都很好地输入了。但是还是……

我最近工作的网站也有每个域的自定义,但这基本上只是网站显示的语言。所以直接在每个请求的开头(global.asax's Begin_Request)我们只需在CurrentThread 上设置当前CultureID(此线程处理一个域的传入HTTP 请求,并提供响应)。然后,我们可以为our-domain.com 显示英语,为our-domain.fr 显示法语等。因此,文化与当前 URL 的域具有直接的一对一映射。然后可以使用 .resx 文件完成本地化逻辑。我们在整个代码中分布的当前cultureID 上也有一些有限的条件逻辑,以允许某些部分不可用,或发送本地化电子邮件和其他不直接请求相关的内容。

说来话长,但是以基于当前域的类似方式在整个代码中传播每个域的细节/配置将是一种替代方法。但这不会像您所说的那样真正重用现有逻辑。所以我会提到最后一种选择。,

您可以使用现有的SiteConfig 类,然后为您拥有的每种配置类型使用一组简单的静态变量(SiteConfiguration 类的实例)。这样,所有内容都被整齐地键入。您可以将 URL 中的域名映射到每个请求开始时匹配的静态配置对象,如我所述,然后访问当前请求的配置。那是假设您有可管理数量的站点,每个站点都非常不同,并且您不必能够从数据库或其他东西动态加载配置。请注意,使用静态变量仍然可以在应用程序启动时从 DB 或 web.config/appSettings(或其他)加载。当您使用 web.config/appsettings 时,它的优点是站点会在您更改新配置时自动重新加载/重新启动。

2。使用区域的

关于将区域用于不同的站点而不是不同的域。这取决于你想要什么。但是我看到区域更多的是允许在一个站点上拥有不同的部分,这些部分在功能上是不同的。例如。它们没有太多共同点,因此不共享任何通用代码。区域基本上允许您将一组以某种方式相关的控制器、模型和视图放入站点的一个area。然后通过区域路由,将网站的一个部分中的不同功能分开,这对用户来说也是显而易见的,也可以从相同的 URL 开始。

根据您的说法,您的所有网站似乎都共享相同的通用代码,但只是通过一些配置进行了自定义。所以我认为 area 不符合你的问题。

【讨论】:

    【解决方案2】:

    在您的缓存中设置此信息就可以了,但只要您的应用程序回收,它就需要重新加载,这通常不是问题。我认为这遵循模型,因为每个请求都为您提供了您需要从缓存中提取的信息,因为它基于请求域,您实际上不需要在数据库中查找它或进行昂贵的调用除了第一次构建它。

    您也可以考虑将这些数据移动到您的 web.config 文件中,但我假设有一个站点有许多指向它的域您想要自定义?

    只需确保将缓存数据与它关联并通过该索引访问的站点建立索引,因为指向一个应用程序的所有域都将只使用一个缓存。

    【讨论】:

      猜你喜欢
      • 2010-10-17
      • 2010-09-13
      • 1970-01-01
      • 2011-12-15
      • 2017-11-24
      • 2023-03-05
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多