CRUD операции на сложных DTO - PullRequest
1 голос
/ 23 декабря 2011

Нужен совет о «лучшем» способе выполнения операций обновления и удаления в сложных вложенных DTO. Для очень простого примера, предположим, у нас есть эта структура:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public Employer Company { get; set; }
}
public class Employer
{
    public string Name { get; set; }
    public string Address1 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
}

Обновление Person согласно данным работодателя может означать несколько вещей: 1. Раньше не было Работодателя для Человека, и нам нужно сделать вставку в БД, чтобы представить нового Работодателя. 2. Ранее был Работодатель, и мы просто обновляем внутренние Данные Работодателя. 3. Работодатель был отстранен от лица

Вопрос:

Если у вас есть объект, связанный с доменом / бизнесом, что-то вроде PersonBusinessComponent с каким-то методом, например PersonBusinessComponent.Update (Person) Каков наилучший способ определить, какой сценарий выполняется, и применить изменения - то есть, если это операция удаления, мы вызовем некоторый метод EmployerDALC.Delete или, если это вставка, то, очевидно, EmployerDALC.Insert и т. Д ... Я понимаю, что одним из вариантов является получение текущей версии из базы данных, а затем утомительно сравнивать наличие каждого вложенного объекта в Person, но я надеюсь, что есть какой-то лучший способ или даже, возможно, более общий способ, который может быть реализован для обработки любых таких операций в Целое решение.

Примечание. Я не использую MS Entity Framework.

1 Ответ

0 голосов
/ 23 декабря 2011

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

Если это так, то ваша бизнес-логика (внутри уровня «Службы») будет отвечать за организацию операций, например:

public interface PersonManager
{
  void CreateNewPerson(Person person);
  void DeletePerson(Person person);
  void ModifyPerson(Person person);
  // ... and so on .../
}

Затем PersonManager будет отвечать за проверку объекта и определение того, что с ним делать, на основе запуска метода.

Затем он перейдет на собственный уровень бизнес-логики (который может взаимодействовать с DAL), чтобы точно определить, как это должно быть достигнуто. Например, с помощью метода Modify он может запросить DAL, чтобы получить текущего нанимателя для этого лица, перейти к ModifyEmployer, если наниматель изменился, и т. Д .:

public void ModifyPerson(Person person)
{
  var currentEmployer = DAL.Employers.Get(Person.Employer.EmployerID);
  if (currentEmployer != person.Employer)
  {
    // Try and get a matching Employer from the appropriate Service (liaising with the DAL)
    var employer = EmployerManager.GetEmployer(person.Employer.EmployerID);
    if (employer == null)
    {
      // ... Create a new employer
    }
    else if (employer != person.Employer)
    {
      // ... Update existing employer
    }
  }

  // ... Now go ahead and handle any changes to the person
}

Сверх того, я не могу придумать какой-либо конкретный пакет, чтобы справиться с этим для вас, в общем, я бы сказал, что это все в архитектуре вашей системы и как BL разговаривает с DAL, но я конечно, один из мозговых блоков здесь предложит несколько лучших предложений:)

Надеюсь, это немного поможет!

К.

...