Здравствуйте!
Есть некая форма, которая отображает набор одних и тех же сущностей в двух видах. Сущности эти из одной и той же таблицы БД. Но для удобства работы заказчик попросил представлять их одновременно на одной форме в виде дерева и в виде таблицы. В таблице на форме находится полный список этих сущностей. В БД есть таблица родитель-потомок для построения дерева этих сущностей. Было принято решение сделать две модели: одну для табличного отображения, другую для дерева. Чтобы не путаться в моделях был сделан класс (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);
}
}