将ASP.NET移植到MVC.NET的建议 - 将SiteConfiguration存储在Cache RESTful中吗?

时间:2010-04-26 22:11:03

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

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

保持包含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; }

我在考虑使用这样的网址结构:

www.MySite1.com/PageTemplate/UserControl /

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

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

有人可以告诉我,我是否完全错过了这里的RESTful点?我想将平台重构为MVC,因为它更适合工作,但我想做得对,但最少重新发明轮子,否则它将无法获得批准。不然有任何建议吗?

编辑:区域?“是否可以选择使用ASP.NET MVC 2区域,其中每个区域代表不同的网站,包括css,javascript等等。

2 个答案:

答案 0 :(得分:1)

我同意接受的答案。因为这个答案没有明确地提到你关于RESTful的问题,我想补充一点(1)。还有关于区域(2)的问题。

0。 MVC.NET?

但首先我要说的是MVC.NET,官方用语为ASP.NET MVC。使用ASP.Net,您可能需要ASP.NET Webforms。完整的术语更清楚地表明MVC仍然只是ASP.NET的扩展。然后,如果您愿意,也可以在同一个项目中混合和匹配MVC视图和“旧”.aspx页面,这并不奇怪。这可以是将项目从WebForms移植到MVC的简单方法,允许在一段时间内逐步迁移内容并从中获取新内容,例如敏捷的方式。注意要小心更新用户/ SEO的路由/ URL)。

1。使用缓存

使用缓存进行每个域的自定义确实足够REST。我假设你主要对真正RESTful服务的'无状态'属性提出疑问。只有当您使用SiteConfiguration对象进行每用户自定义时,才会违反该要求。当每个域的配置只有不同的更改时,状态/配置是在URL中封装的(例如域名),因此状态/配置进出用户,并且您的服务本身是无状态的。

根据this SO article,使用.NET的Cache对象而不是像Application对象这样的替代方法也有一些优势。

我个人不喜欢使用缓存来进行基本的建筑事务,因为它是无类型的。所以你必须从缓存中转换所有东西。我在这里挑剔,因为你只有一个大的配置对象,所以这只需要做一次,并且其中的所有内容都很好地输入。但仍然.. ..

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

很长一段时间,但基于当前域,以类似的方式在您的代码中传播每个域的特定/配置将是一种替代方案。但是,这并不会像你想要的那样重用现有的逻辑。所以我会提到最后一个替代方案。

您可以使用现有的our-domain.fr类,但是对于您拥有的每种配置类型,都使用一组简单的静态变量(SiteConfig类的实例)。这样一切都整齐排序。您可以在我指示的每个请求开始时将URL中的域名映射到匹配的静态配置对象,然后访问当前请求的配置。假设您拥有可管理数量的站点,每个站点都非常不同,并且您不必从数据库或其他东西动态加载配置。请注意,使用静态变量仍然可以从应用程序启动时从数据库或SiteConfiguration / appSettings(或其他)加载它们。当您使用web.config / appsettings时,它具有以下优点:当您更改新站点时,站点将自动重新加载/重新启动。

2。使用Area的

关于将区域用于不同的站点而不是不同的域。这取决于你想要什么。但我认为区域更多是允许在一个站点上具有不同的部分,这在功能上是不同的。例如。没有太多共同点,因此不共享任何通用代码。区域基本上允许您将一组以某种方式相关的控制器,模型和视图放入站点的一个web.config。然后通过区域路由,将站点的一部分内的不同功能分离给用户,这也是通过相同的URL开始的。

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

答案 1 :(得分:0)

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

您还可以考虑将此数据移至您的web.config文件,但我假设有一个网站指向您想要自定义的许多域?

只需确保使用与其关联的网站索引缓存数据并通过该索引进行访问,因为指向一个应用的所有域只使用一个缓存。