我在我的 asp.net mvc 项目中找到了实现多租户的解决方案,我想知道它是否正确或是否存在更好的方法。
我想使用处理 Web 请求的相同应用程序来组织更多客户,例如:
http://mysite/<customer>/home/index //home is controller and index the action
出于这个原因,我更改了默认的地图路由:
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
...................................
这个解决方案效果很好,但我不知道是否是最好的方法。有谁知道更好的方法?