复杂DTO上的CRUD操作

时间:2011-12-23 06:30:59

标签: c# asp.net .net dto

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

根据雇主在这里更新人员可能意味着几件事: 1.之前没有雇主雇主,我们需要插入DB来介绍新的雇主。 2.之前有雇主,我们只是更新雇主的内部数据 3.雇主已从人员中删除

问题:

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

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

1 个答案:

答案 0 :(得分:0)

这取决于系统的体系结构。这是程序模型,ActiveRecord模型还是域模型?我看到你正在使用DTO,这意味着一个域模型。

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

public interface PersonManager
{
  void CreateNewPerson(Person person);
  void DeletePerson(Person person);
  void ModifyPerson(Person person);
  // ... and so on .../
}
然后,PersonManager将负责检查对象并根据运行方法确定如何处理它。

然后将它推迟到自己的业务逻辑层(可以与DAL交谈),以确切地确定应该如何实现。例如,使用Modify方法,它可以查询DAL以获取该Person的当前雇主,如果雇主已更改等,则推迟到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对话,但我是确定这里的一个脑盒会提出一些更好的建议:)

希望这可能会有所帮助!

ķ。