Вызов определенных методов на основе определенного конструктора

#c# #wpf

#c# #wpf

Вопрос:

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

 public ManageRecord(Record record ){ //update  record     }

public ManageRecord(){ //save new record     }

private void Save_Click(object sender, RoutedEventArgs e){
    //if default constructor invokes form call save method
    SaveMethod();
    //if constructor with parameters invokes form call update method
    UpdateMethod(record);
}
  

Как мне этого добиться?

Комментарии:

1. Почему вы решили привлечь к этому конструкторы?

2. Я чувствую здесь проблему XY. Чего вы на самом деле пытаетесь достичь с помощью этого? Расскажите нам о вашей основной проблеме, и мы поможем вам исправить ее правильным образом.

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

4. @EdPlunkett я был бы рад, если бы вы могли подсказать мне лучший метод

5. @BradleyUffner я хочу выполнить обе задачи с помощью одной и той же формы / окна. и нет, это не в модели представления. Я новичок, и MVVM на данный момент у меня плохо работает

Ответ №1:

Что я делал в прошлом, чтобы решить эту проблему, так это иметь поле первичного ключа в модели в качестве Nullable поля. Когда вы пытаетесь сохранить запись, вы можете просто посмотреть на поле в модели, если MyPk.HasValue возвращает true значение, то вы обновляете запись, если это так false , вы вставляете новую запись.

Когда вы вызываете конструктор, который принимает экземпляр model, просто сохраните его в локальном поле. При вызове конструктора без модели создайте новый экземпляр модели с нулевым значением PK и сохраните его в локальном поле. Save можно просто проверить локальное поле.

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

Комментарии:

1. Примечание: возможно, вы захотите подчеркнуть тот факт, что в этом случае будет вызываться только один метод (например SaveOrUpdate() )

2. я подумал о проверке идентификатора записи, которая передается конструктором, я только надеялся, что существует предварительно установленный

3. я думал о проверке идентификатора записи, которая передается конструктором, я только надеялся, что существует заранее установленный или лучший метод достижения того же результата

4. В него ничего не встроено. Вы всегда можете установить флаг, как в ответе, который дал @FrumRoll, но я чувствую, что гораздо лучший способ сделать это, полагаясь на свойства модели. Модель всегда должна быть там и быть согласованной. Если вы установили флаг из конструктора, вам нужно будет не забыть установить его, если вы когда-нибудь добавите другой конструктор. Это также может вызвать у вас проблемы, если вы когда-нибудь решите реализовать внедрение зависимостей.

Ответ №2:

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

 private readonly bool _isNewEntity;

public ManageRecord()
{
    _isNewEntity = true;
    // Same as existing, _record = new Record() ?
}

public ManageRecord(Record record)
{
    _isNewEntity = false;
    // Same as existing, _record = record ?
}

private void Save_Click(object sender, RoutedEventArgs e)
{
    if (_isNewEntity)
        SaveMethod();
    else
        UpdateMethod(record);
}