我有一个Order对象,Order对象包含一个Person对象,该对象存储有关下订单的人的信息。当我填充Order对象时,我应该填充Person对象吗?或者,每当我需要访问下订单的人时,我会更好地调用order.GetPerson()。
答案 0 :(得分:2)
您可以考虑使用LazyLoading
方法。这样,Person数据将在需要时被提取和加载(第一次查询)
延迟加载是计算机编程中常用的设计模式 将对象的初始化推迟到它所在的点 需要
答案 1 :(得分:0)
如果资源是一个问题,那么Shyju的答案是有道理的。否则,如果您始终知道与订单关联的人,那么,填写它。此外,尽可能经常使对象不可变是一个好主意,在这种情况下你可能会这样做;即通过构造函数传递此人并且永远不会更改它。
答案 2 :(得分:0)
如果未设置
Order
属性,Person
对象是否有效?
如果必须将order.Person
设置为Person
对象以使order
处于有效状态,那么您很可能希望Order
构造函数接受Person
对象。这是因为构造函数应该始终构造有效的对象,而不仅仅是部分有效的对象。
public class Order
{
public Order(Person person)
{
this.person = person;
}
public Person Person { get { return person; } }
readonly Person person;
}
另一方面,如果order.Person
不需要初始化Order
以使Person
有效,那么您的构造函数不需要Person
参数。相反,您可以使public class Order
{
public Order() { … }
public Person Person { get; set; }
}
成为可读写属性:
Person
如果您这样做,请回答以下问题:
Person
属性可以多次设置到不同的Person
实例是否有意义?
如果是,那么上面显示的方法一切都很好。
但是,我会回答“否”:订单只能由一个 public Person Person
{
get { return person; }
set
{
if (person != null) throw new InvalidOperationException;
person = value;
}
}
Person person;
发出,而这在以后不会改变。你可以考虑让属性只能设置一次,后续尝试设置它会触发异常:
Person
......但这可能不是很直观。更好的方法可能是从构造函数设置Order
属性并使属性为只读(如上所示)。这可能看起来过于严格,但对于{{1}}对象的所有用户来说可能更直观。
答案 3 :(得分:0)
正如Chris Sinclair的评论所指出的那样,它确实归结为您的设计,并考虑到您需要Person对象的频率。如果几乎每次加载Orders时,您都需要关联的Persons(用于显示或计算等),那么始终加载Persons以限制数据库调用的数量是有意义的。如果您几乎不需要Person数据,那么以后期绑定/延迟加载方式获取Person数据会更有意义。
考虑这个例子。您检索所有订单以在网格中显示它们。但是当您填充网格时,您还希望显示每个订单的人员信息。如果您使用每个订单加载Person数据,您只需循环订单,您就不再有数据库调用。如果您使用延迟加载Person数据,那么当您循环订单时,您必须为每个Order进行额外的数据库调用以获取Person数据。这是很多电话。
如果合适,您还可以拆分差异和设计加载方法,您可以将标记传递给“LoadChildren”。这样做可以为您提供最大的灵活性,但牺牲了可维护性/可读性,因为根据您在代码中的位置,您不一定知道Person数据是否已填充。