Почему в моем прототипе MVC данные в памяти сохраняются в течение нескольких сеансов браузера? - PullRequest
2 голосов
/ 30 октября 2009

У меня есть базовое приложение MVC - сгенерированное из шаблона приложения MVC. Я создал базовый контроллер, который содержит обычные методы Index, Details, Edit и Create; У меня есть пара классов, один из которых содержит мой объект Person:

public class Person
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Description { get; set; }
}

И еще один, чтобы издеваться над поддельным DAL. Он не сохраняет данные в файл или базу данных, это всего лишь быстрый макет для целей этого прототипа:

public class PersonData
{
    /* Fake out our initial repository */
    static List<Person> People = new List<Person>()
    {
        new Person() { Id=1, FirstName="John", LastName="Doe", Description="King of the world" },
        new Person() { Id=2, FirstName="Jane", LastName="Doe", Description="Chief whip cracker" }
    };

    /* Set up the indexing system */
    private static int GetNextId()
    {
        return People.OrderByDescending(i => i.Id).First().Id + 1;
    }

    public static IEnumerable<Person> GetPeople()
    {
        return People;
    }

    public static Person GetPerson(int id)
    {
        if (id > People.OrderByDescending(i => i.Id).First().Id)
            throw new ArgumentOutOfRangeException();

        return People.Where(i => i.Id.Equals(id)).SingleOrDefault();
    }

    public static void Save(Person data)
    {
        /* Either remove the old one or assign a new ID */
        if (data.Id != 0)
            People.Remove(People.Where(i => i.Id.Equals(data.Id)).SingleOrDefault());
        else
            data.Id = GetNextId();

        People.Add(data);
    }
}

В контроллере нет ничего особенно интересного, вот отрывок из функции редактирования:

    // GET: /Person/Edit/5
    public ActionResult Edit(int id)
    {
        Person person = PersonData.GetPerson(id);
        return View(person);
    }

    //
    // POST: /Person/Edit/5
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Edit(Person person)
    {
        try
        {
            PersonData.Save(person);
            return RedirectToAction("Details", person);
        }
        catch
        {
            return View(person);
        }
    }

Все работает, но я заметил пару любопытных аномалий, которые я не могу объяснить. Прежде всего, если я внесу изменения в человека в форме редактирования и сохраню его, все будет хорошо отражено на странице сведений. Затем я запускаю другой экземпляр браузера - Opera / Chrome / Wh независимо и ввожу страницу подробностей для этого человека. Я ожидал увидеть, что во втором браузере я буду видеть данные, предшествующие моим изменениям, потому что PersonData загружается только в память и не сохраняется - однако я вижу изменения, которые были сделаны в браузере 1 во втором браузере.

Я объяснил это тем, что я работаю на сервере разработки Visual Studio и предположил, что я просто получаю доступ к той же сессии. Чтобы подтвердить гипотезу, я добавил идентификатор сеанса на страницу сведений, ожидая увидеть тот же идентификатор сеанса, но я ошибся. У каждого сеанса свой идентификатор.

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

Я не понимаю, почему это так, и задаюсь вопросом, может ли кто-нибудь объяснить:

  • Почему данные из моего макета DAL сохраняются в обоих браузерах, когда они оба находятся в разных сеансах?
  • Почему идентификатор сеанса не поддерживается при обновлении страницы?

Заранее спасибо

Ответы [ 3 ]

6 голосов
/ 30 октября 2009

Ваш фальшивый репозиторий объявлен статическим:

/* Fake out our initial repository */
static List<Person> People = new List<Person>()
{
    new Person() { Id=1, FirstName="John", LastName="Doe", Description="King of the world" },
    new Person() { Id=2, FirstName="Jane", LastName="Doe", Description="Chief whip cracker" }
};

Статика существует на протяжении всего процесса, она не привязана к сеансу ASP.NET. Поэтому все ваши сеансы будут видеть данные до тех пор, пока процесс веб-сервера не будет перезапущен (в вашем случае процесс веб-сервера разработки VS).

2 голосов
/ 30 октября 2009

Вы используете статические объекты? Если это так, они являются общими для каждого экземпляра среды выполнения.

0 голосов
/ 30 октября 2009

Может быть, вы могли бы поделиться реализацией вашего "DAL mock"? Нельзя быть уверенным, но кажется, что твоя насмешка немного испорчена, ты проверил это сначала?

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