Как хранить данные или сохранять их в разных формах - PullRequest
0 голосов
/ 23 марта 2012

Я создал программу с Windows Forms на C #, и ее архитектура выглядит примерно так

* BaseClass.cs
* EntityClass.cs
* ControllerClass.cs
* DataAccessClass.cs
* Viewer.cs

Таким образом, класс Entity в основном наследуется от базового класса, а класс доступа к данным отправляет и получает данные из базы данных MySql.

То, что я хочу сделать, - это иметь возможность использовать извлеченные данные без необходимости вызова класса доступа к данным, если я уже извлек их один раз ... где я могу поместить эти данные, чтобы я мог получить к ним доступ где угодно? *

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

Привет

Ответы [ 4 ]

1 голос
/ 23 марта 2012

Похоже, вы хотите продолжить работу с шаблоном MVC и представить компонент "Модель", который используется двумя вашими представлениями. Модель будет инициализирована / обновлена ​​с использованием вашего DataAccessClass. Каждая форма (или представление) должна иметь ссылку на модель. Я бы не советовал использовать сериализацию, поскольку вы просто совместно используете объект C # в памяти в одном и том же процессе между двумя различными формами.

Например:

public class MyFirstView : Form
{    
  private ModelClass m_model;
  public MyFirstView(ModelClass model)
  {
     m_model = model;
     m_model.OnDataRefresh += this.Model_OnDataRefresh;
  }   
}

public class MySecondView : Form
{    
  private ModelClass m_model;
  public MySecondView(ModelClass model)
  {
     m_model = model;
     m_model.OnDataRefresh += this.Model_OnDataRefresh; 
  }   
}

public class ModelClass 
{
   private DataAccessClass m_dataAccess;

   public event EventHandler OnDataRefresh = {}; // fired when data is refreshed

   public void EnsureDataIsLoaded();  // queries the db if we haven't already
   public void RefreshData(); // refreshes the data from the db
   public IList<Entity> GetDataList(); // access to data items
}

Для каждой формы / представления вы можете использовать событие Form.Load, чтобы обновить представление данными модели. Возможно, у вас может быть метод для ModelClass.EnsureDataIsLoaded (), который будет использовать DataAccessClass для запроса базы данных, если вы этого еще не сделали.

И, наконец, если модель меняется, вам нужно каким-то образом отодвинуть изменения в представлениях. Один из способов сделать это - заставить модель генерировать событие при обновлении данных, и каждое представление подписывается на это событие.

0 голосов
/ 23 марта 2012

Вам не нужно ничего сериализовать, вы можете просто удерживать ссылки в каком-то слое кеша.

Предполагая, что ваши классы доступа к данным принимают какой-либо запрос в качестве параметра, вы можете сохранить результаты в словаре, снабженном запросом. Затем вы сначала проверяете кеш на результаты запроса, если нет, то идите в базу данных, извлекаете ее и кешируете. Если вы используете лямбда-выражения для своих запросов, вы можете вызвать метод .GetHashCode (), чтобы получить уникальный хеш для этой лямбды.

EX:

IDictionary<string, IEnumerable<T>> Cache;

IEnumerable<T> GetData<T>(string query)
{
    var key = typeof(T).Name + query;
    if (!this.Cache.ContainsKey(key))
    {
        // get from database
        var data = SomeRepository.GetData(query);
        this.Cache[key] = value;
    }

    return this.Cache[key]
}
0 голосов
/ 23 марта 2012

Я предлагаю вам взглянуть на класс System.Runtime.Caching.MemoryCache. Это может удовлетворить ваши потребности.

0 голосов
/ 23 марта 2012

Я бы предложил использовать статический класс для хранения данных. Если у вас будет открыто несколько форм одновременно, вы можете иметь словарь в статическом классе, снабженный ключом некоторого идентификатора формы.

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