我如何处理具有合成的对象

时间:2009-06-26 07:54:55

标签: c#

我的名字是安德森,在这一刻我对表现的构成指示有一些疑问。在这个模型中 我有一个简单的用户群 departmentbase 。 userbase具有deparmentbase类型的属性,departmentbase具有类型为departmentbase的list属性。 当我有一个userbase实例时,加载有关部门的信息,但随后DepartmentBase加载有关部门的信息!!!。

现在,当我为所有用户提供了一个用户库列表时,所有用户的流程再次加载,这是一个很好的做法,或者什么是更好的表单?

alt text http://img146.imageshack.us/img146/3949/diagram.jpg

2 个答案:

答案 0 :(得分:3)

我不知道它是否是更好(甚至适用)的方法,但我有时会制作我用于其他对象引用的对象的简短版本。 breif版本充当对象的完整版本的基类,并且通常包含在这些对象的列表中可见的信息。它通常不包含其他对象的列表,对其他类的任何引用通常都会引用该类的简要版本。这消除了一些不必要的数据加载,以及一些循环引用的情况。例如:

public class DepartmentBrief
{
    public string Name { get; set; }
}
public class Department : DepartmentBrief
{
    public Department()
    {
        Departments = new List<DepartmentBrief>();
    }
    public IEnumerable<DepartmentBrief> Departments { get; private set; }
}
public class UserBase
{
    public DepartmentBrief Department { get; set; }   
}

此方法与具有延迟加载的完整对象引用之间的一个区别是,您需要在需要时显式加载额外数据。如果您有UserBase实例,并且需要Department UserBase中的部门列表,则需要编写一些代码来获取Department对象DepartmentBrief中的UserBase对象正在识别。这可能被认为是一个缺点,但我个人喜欢这样一个事实,即在准确查看代码到达数据存储时,它将会很清楚。

答案 1 :(得分:2)

这取决于,如果您在加载用户列表后直接需要所有部门数据,那么这是最好的方法。如果您不立即需要它,最好使用 lazy loading 作为部门数据。这意味着您推迟加载部门数据,直到调用显式方法(或属性)。