Две модели на одной форме
От: corpse56  
Дата: 13.03.17 09:36
Оценка:
Здравствуйте!
Есть некая форма, которая отображает набор одних и тех же сущностей в двух видах. Сущности эти из одной и той же таблицы БД. Но для удобства работы заказчик попросил представлять их одновременно на одной форме в виде дерева и в виде таблицы. В таблице на форме находится полный список этих сущностей. В БД есть таблица родитель-потомок для построения дерева этих сущностей. Было принято решение сделать две модели: одну для табличного отображения, другую для дерева. Чтобы не путаться в моделях был сделан класс (ModelHolder), который эти модели инкапсулирует и вызывает методы обновления обоих моделей сразу. Вот тут и возникает вопрос, а где и кто должен вызывать методы обновления БД? Сложность в том, что действия над деревом могут затрагивать изменения в таблице, и наоборот. Получается, что одна модель себя изменила, дальше ей нужно и вызвать методы БД, и изменить другую модель, которая в свою очередь хочет того же! Поулчается такая рекурсия чтоли, из которой я не могу выбраться... Когда речь об одной модели, то тут понятно — она же и дёргает базу. А если речь о двух параллельных моделях, то я теряюсь. Вроде бы дёргать БД можно из ModelHolder, но тогда я эти модели не смогу использовать в таком же виде в других местах, ведь они в таком случае не будут уметь работать с базой. Ещё одно решение — сделать общую модель и для дерева и для таблицы. Тогда всё становиться понятно. ModelHolder не нужен и мы из самой модели вызываем методы БД после обновления модели. Но опять же, эта модель получиться только для этой формы и больше нигде её не удастся использовать. А отдельная модель для таблицы и для дерева будет неоднократно использоваться в проекте. Подскажите пожалуйста, как лучше тут поступить, чтобы потом можно было повторно использовать код этих моделей? Спасибо





Пример с использованием промежуточного класса, который держит обе модели и вызывает обновление данных в БД:
Псевдокод
class ModelHolder
{
   ModelTree _mtr = new ModelTree();
   ModelTable _mtb = new ModelTable();
   
   DataBaseWorker _dbw = new DataBaseWorker();   

   public void AddNewElement(object ob)
   {
      _mtr.AddNew(ob);
      _mtb.AddNew(ob);
      
      _dbw.AddNew(ob);
   }

}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.