需要就在复杂嵌套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。
答案 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对话,但我是确定这里的一个脑盒会提出一些更好的建议:)
希望这可能会有所帮助!
ķ。