2012-04-25 26 views
6

我的应用程序需要轻量级和重量级的对象。是否有轻型和重型版本的对象的设计模式?

  • 轻量级对象只包含ID字段,但不包含相关类的实例。
  • 重量级对象将包含ID和这些类的实例。

下面是一个例子类(仅用于讨论的目的):

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检查。

编辑: 此对象模型用于客户端服务器应用程序的客户端。在我使用轻量级对象的情况下,我不想延迟加载,因为这会浪费时间和内存(我已经将对象放在客户端的其他内存中)

回答

2

有你考虑使用像NHibernate这样的ORM工具来访问数据库?如果你使用类似NHibernate的东西,你会通过延迟加载来获得这种行为。

大多数ORM工具都会在延迟加载中执行您正在查找的内容 - 它们首先获取对象标识符,并在访问方法时发出后续查询以加载相关对象。

3

延迟初始化,虚拟代理和Ghost是三种延迟加载模式的实现。基本上,一旦你需要它们,它就会引用加载属性。现在,我想你会使用一些回购存储对象,所以我鼓励你使用任何可用的ORM工具。 (Hibernate,Entity Framework等),它们都为您免费实现这些功能。

+0

我并不总是想要加载完整的对象。有时,我已经有了它的一个实例,所以我不需要从DB重新加载。 – TheSean 2012-04-25 19:55:37

+1

@TheSean无所谓。这正是该模式的实用性。如果你需要使用它们,那么你加载它们,否则不。现在,如果你正在谈论不暴露重型版本的属性,但也可以通过使用(即两个接口:较轻的和较重的接口)来解决。 – 2012-04-25 19:58:14

+0

举个例子,假设我有1000个订单,每个订单都是同一个产品。使用延迟加载Product对象的建议,我将加载同一对象的1,000个实例。这就是我的意思是浪费记忆。 – TheSean 2012-04-25 20:18:29

0

听起来像您可能需要一个数据传输对象(DTO),只是一个总结业务实体的“愚蠢”包装类。当我需要将一个物体展平时,我通常会使用类似的东西。但要小心:过度使用反模式的结果。

但是渲染一个显示对象不同于限制对数据库的命中。正如Randolph指出的那样,如果你的意图是后者,那么使用现有的延期加载模式之一,或者更好的是使用ORM。

0

查看registry模式,您可以使用它来查找对象并更好地管理这些对象,如将它们保存在缓存中。