Совместное использование данных в приложении ASP.NET MVC

1

Недавно я унаследовал приложение ASP.NET MVC 4, которое использует global.asax для обмена данными между представлениями.

public class MvcApplication : System.Web.HttpApplication
{
    public static List<Models.Feed> feedItems;

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
    }

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );
    }

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        Database.DefaultConnectionFactory = new SqlConnectionFactory(@"Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=True");

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);

        GetDataFromWebService(); //expensive call
    }       
}

Существует много представлений, в которых используются элементы feedItems:

@foreach (var item in MvcApplication.feedItems)
{
    <li>@item.Title</li>                  
}

Я считаю, что приведенная выше реализация неверна (поскольку данные feedItems не изменяются, если только пул приложений не перерабатывается), и должен быть лучший способ сделать это. Мои требования:

  1. Вызовите метод GetDataFromWebService один раз.
  2. Поделитесь элементами feedItems с несколькими видами.

Я посмотрел на эту публикацию, но я не уверен, подходит ли это в моем сценарии, так как я хочу, чтобы веб-сервис ударялся только один раз.

Какой был бы лучший способ сделать это?

Благодарю!

  • 0
    Я не понимаю, почему это неправильно. Вы хотите вызвать метод один раз, и так, как вы это сделали, он вызывается один раз за время существования приложения.
  • 0
    Нужно, чтобы метод вызывался один раз за сеанс, а не один раз за время жизни приложения.
Показать ещё 1 комментарий
Теги:
asp.net-mvc
viewbag

1 ответ

2
Лучший ответ

Храните переменную в области сеанса, если вы хотите получить ее один раз за сеанс.

Global.asax

   protected void Session_Start(Object sender, EventArgs e)
   {
      HttpContext.Current.Session["WebServiceData"] = GetDataFromWebService();
   }

Вы можете использовать сеанс из бритвы.

Посмотреть

@foreach (var item in (IEnumerable<WebServiceItem>)Session["WebServiceData"])
{
    <li>@item.Title</li>
}
  • 0
    Извините за глупый вопрос. Виноват. Не проходил через методы global.asax.
  • 0
    @WhoAmI твой вопрос не глупый. Возможно, это можно было бы переписать так, чтобы было более понятно, как вы ожидаете, что это сработает. Вы должны узнать о различных областях, доступных в asp.net (Session, Cache, QueryString, Form input, Request ...) и почему вы должны избегать статических. Следует избегать сеансов, если вы хотите улучшить масштабируемость.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню