使用MapRoute的多租户应用程序

时间:2012-09-26 09:05:06

标签: asp.net-mvc multi-tenant

我在asp.net mvc项目中找到了实现多租户的解决方案 我想知道它是否正确或存在更好的方式。

我希望使用处理Web请求的相同应用程序组织更多客户,例如:

http://mysite/<customer>/home/index        //home is controller and index the action

因此我更改了默认的maproute:

routes.MapRoute(
    name: "Default",
    url: "{customername}/{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

我实现了自定义ActionFilterAttribute:

public class CheckCustomerNameFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting( ActionExecutingContext filterContext )
    {
        var customerName = filterContext.RouteData.Values["customername"];

        var customerRepository = new CustomerRepository();

        var customer = customerRepository.GetByName( customerName );

        if( customer == null )
        {
            filterContext.Result = new ViewResult { ViewName = "Error" };
        }

        base.OnActionExecuting( filterContext );
    }
}

并使用它:

public class HomeController : Controller
{
    [CheckCustomerNameFilterAttribute]
    public ActionResult Index()
    {
        var customerName = RouteData.Values["customername"];

        // show home page of customer with name == customerName

        return View();
    }
}

使用此解决方案,我可以使用客户名称切换客户并正确接受以下请求:

http://mysite/customer1
http://mysite/customer2/product/detail/2
...................................

这个解决方案效果很好,但我不知道最好的方法。 有谁知道更好的方法吗?

1 个答案:

答案 0 :(得分:0)

您可以建模绑定客户名称,而不必从路由值中提取它:

public ActionResult Index(string customerName)
{
}