Лучший подход, чтобы не запрашивать одну и ту же информацию снова и снова - PullRequest
0 голосов
/ 10 мая 2011

На моем контроллере он унаследовал MainController и там я переопределяю Initialize и OnActionExecuting.

Здесь я вижу, что такое URL, и тем самым я могупроверьте, что это за Клиент , но я узнал, что для каждого вызванного Метода он запускается снова и снова, даже простой redirectToAction будет запускать Инициализацию того же контроллера.

Есть ли лучший метод, чтобы избежать повторения вызова базы данных?Я использую Entity Framework, поэтому для вызова БД не потребуется , поскольку она уже имеет результат в кеше, но ... просто чтобы узнать, существует ли лучшая техника теперь в MVC3 вместо переменных Session Variable

пример кода

public class MyController : MainController
{
    public ActionResult Index()
    {
        return View();
    }
}


public class MainController : Controller
{

   public OS_Clients currentClient { get; set; }

   protected override void Initialize(System.Web.Routing.RequestContext requestContext)
   {
        // get URL Info
        string url = requestContext.HttpContext.Request.Url.AbsoluteUri;
        string action = requestContext.RouteData.GetRequiredString("action");
        string controller = requestContext.RouteData.GetRequiredString("controller");
        object _clientUrl = requestContext.RouteData.Values["cliurl"];

        if (_clientUrl != null && _clientUrl.ToString() != "none")
        {
            // Fill up variables
            this.currrentClient = db.FindClientById(_clientUrl.ToString());
       }

        base.Initialize(requestContext);
    }

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // based on client and other variables, redirect to Disable or Login Actions
        // ... more code here like:

        //  filterContext.Result = RedirectToAction("Login", "My");

        base.OnActionExecuting(filterContext);
    }
}

лучше всего сделать так:

public OS_Clients currentClient { 

    get {
        OS_Clients _currentClient = null;

        if (Session["CurrentClient"] != null)
            _currentClient = (OS_Clients)Session["CurrentClient"];

        return _currentClient;
    }

    set { 
        Session["CurrentClient"] = value; 
    }
}

Ответы [ 2 ]

2 голосов
/ 10 мая 2011

Похоже, что вы имеете дело с безопасностью приложений, в этом случае я бы предложил создать фильтр Authorization, который вступает в действие очень рано.Вы можете поместить туда свой код проверки разрешений, и платформа автоматически перенаправит пользователя на страницу входа, если разрешение не соответствует AuthorizeCore.

Далее, если у пользователя есть разрешение, вы можете использовать HttpContext.Itemsкак кеш уровня запросов.И затем вы можете создать еще один ActionFilter и в действии выполнить или вы можете использовать базовый контроллер, чтобы получить пользователя из Httpcontext.items и назначить его свойству контроллера.

Если вы используете asp.net mvc3 затем вы можете использовать GlobalFilters для регистрации вышеупомянутых фильтров вместо того, чтобы украшать каждый контроллер.

Надеюсь, что это поможет.

0 голосов
/ 10 мая 2011

В вашем базовом контроллере вам необходимо кэшировать результат первого вызова в переменной Session.

Это гарантирует, что серверная часть (DB) не будет вызываться без необходимости, и что данные привязаны к сеансу пользователя, а не распределяются между пользователями, как в случае с кешем приложений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...