1

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
...................................

このソリューションはうまく機能しますが、最善のアプローチかどうかはわかりません。誰かがより良い方法を知っていますか?

4

1 に答える 1

0

顧客名をモデル バインドでき、ルート値からプルする必要はありません。

public ActionResult Index(string customerName)
{
}
于 2012-10-29T18:52:37.003 に答える