我需要在我的应用程序中使用轻量级和重量级的对象。
以下是一个示例类(仅供讨论之用):
public class OrderItem
{
// FK to Order table
public int OrderID;
public Order Order;
// FK to Prodcut table
public int ProductID;
public Product Product;
// columns in OrderItem table
public int Quantity;
public decimal UnitCost;
// Loads an instance of the object without linking to objects it relates to.
// Order, Product will be NULL.
public static OrderItem LoadOrderItemLite()
{
var reader = // get from DB Query
var item = new OrderItem();
item.OrderID = reader.GetInt("OrderID");
item.ProductID = reader.GetInt("ProductID");
item.Quantity = reader.GetInt("Quantity");
item.UnitCost = reader.GetDecimal("UnitCost");
return item;
}
// Loads an instance of the objecting and links to all other objects.
// Order, Product objects will exist.
public static OrderItem LoadOrderItemFULL()
{
var item = LoadOrderItemLite();
item.Order = Order.LoadFULL(item.OrderID);
item.Product = Product.LoadFULL(item.ProductID);
return item;
}
}
是否有良好的设计模式可以实现这一目标?
我可以看到如何将它编码为单个类(如上面的示例),但是使用实例的方式并不明显。我需要在整个代码中进行NULL检查。
修改 此对象模型正在客户端 - 服务器应用程序的客户端上使用。在我使用轻量级对象的情况下,我不想要延迟加载,因为这将浪费时间和内存(我已经在其他地方的客户端内存中有对象)
答案 0 :(得分:3)
延迟初始化,虚拟代理和Ghost是该延迟加载模式的三种实现。基本上,一旦您需要它们,它们就会引用负载属性。现在,我想你将使用一些仓库存储对象,所以我鼓励你使用任何可用的ORM工具。 (Hibernate,Entity Framework等),它们都为您免费实现这些功能。
答案 1 :(得分:2)
您是否考虑过使用像NHibernate这样的ORM工具来访问数据库?如果你使用像NHibernate这样的东西,你会通过延迟加载来获得这种行为。
大多数ORM工具在延迟加载中完全按照您要求的方式执行 - 它们首先获取对象标识符,并在访问方法时,发出后续查询以加载相关对象。
答案 2 :(得分:0)
听起来您可能需要数据传输对象(DTO),这只是一个总结商业实体的“哑”包装类。当我需要展平一个物体进行展示时,我通常会使用类似的东西。但是要小心:过度使用导致反模式。
但渲染显示对象不同于限制对数据库的命中。正如Randolph指出的那样,如果您的意图是后者,那么使用现有的延迟加载模式之一,或者更好的是,使用ORM。
答案 3 :(得分:0)
查看registry模式,您可以使用它来查找对象,也可以更好地管理这些对象,例如将它们保存在缓存中。