【问题标题】:CRUD operations on complex DTO复杂 DTO 上的 CRUD 操作
【发布时间】:2011-12-23 06:30:58
【问题描述】:

需要有关在复杂嵌套 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; }
}

此处根据 Employer 更新 Person 可能意味着几件事: 1. 以前 Person 没有 Employer,我们需要插入 DB 来引入新的 Employer。 2.之前有一个Employer,我们只是在更新Employer的内部数据 3. 雇主已从 Person 中删除

问题:

如果你有一个域/业务组件对象,比如 PersonBusinessComponent 和一些方法,比如 PersonBusinessComponent.Update(Person) 识别正在执行哪个场景并应用更改的最佳方法是什么——这意味着如果它是一个删除操作,那么我们将调用一些 EmployerDALC.Delete 方法,或者如果它是一个 Insert 那么显然是 EmployerDALC.Insert 等...... 我知道一种选择是从数据库中获取当前版本,然后繁琐地比较 Person 中每个嵌套对象的存在,但我希望有一些更好的方法,甚至可能更通用的方法可以实现来处理任何此类操作整个解决方案。

注意:我没有使用 MS Entity Framework。

【问题讨论】:

  • 这取决于您系统的架构。这是程序模型、ActiveRecord 模型还是领域模型?我看到您正在使用 DTO,因此这意味着域模型。

标签: c# asp.net .net dto


【解决方案1】:

这取决于您的系统架构。这是程序模型、ActiveRecord 模型还是领域模型?我看到您正在使用 DTO,因此这意味着域模型。

如果是这样,那么您的业务逻辑(在“服务”层内)将负责编排操作,例如:

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

PersonManager 随后将负责检查对象并根据 run 方法确定如何处理它。

然后它会推迟到自己的业务逻辑层(可以与 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 对话,但我是肯定这里的大脑盒之一会提出一些更好的建议:)

希望能有所帮助!

K.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-04
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多