ASP.NET MVC Multi站点 - 存储站点配置数据的位置

时间:2010-09-08 21:49:01

标签: asp.net-mvc

我正在开发一个ASP.NET MVC多站点应用程序(可以从同一个应用程序实例/多租户应用程序托管多个站点)。

我之前在Web表单应用程序中完成了此操作,并在自定义基页的page_load事件中加载了相应的站点配置数据(通过检查URL)。

使用ASP.NET MVC,我最好在Application_BeginRequest中做同样的事情吗?然后我可以将配置对象添加到HttpContext.Current.Items。

2 个答案:

答案 0 :(得分:2)

This blogger看起来是一篇关于asp.net-mvc中多租户的一系列文章

你提到的听起来像是一种可行的方式来做你想做的事,虽然它可能不是惯用的解决方案。

答案 1 :(得分:2)

我正在做与我正在研究的当前sytsem类似的事情。

我正在通过用户访问应用程序的URL来确定网站,如下所示:

public class BaseController : Controller
{
    protected override void Initialize(RequestContext requestContext)
    {
        var host = requestContext.HttpContext.Request.Url.Host;
        Site = _siteService.GetSiteByHost(host);

        base.Initialize(requestContext);
    }       
}

我系统中的每个Controller都扩展了BaseController,因此Site对象可用于每个Controller。如果您有任何更具体的问题,请询问,我会告诉您我们做了什么。

<强> upate

您在上面看到的是_siteService.GetSiteByHost(host)。 SiteService在它和Repository之间有一个缓存层,它负责处理所有缓存相关的东西。它被定义为:

    public Site GetSiteByHost(string host)
    {
        string rawKey = GetCacheKey(string.Format("GetSiteByHost by host{0}", host));

        var site = (Site)_cachingService.GetCacheItem(rawKey);

        if (site == null)
        {
            site = _siteRepository.GetSiteByHost(host);
            AddCacheItem(rawKey, site);
        }

        return site;
    }

我们尽量不使用Sesson,除非我们处理简单的数据类型,比如int。我不会在Session中存储Site对象,但我会在会话中存储一个代表SiteId的int。然后,当用户下次访问应用程序时,我可以通过Id从缓存中获取与当前用户关联的Site对象。在上面的情况下虽然没有必要。