是否有光和设计模式?对象的重型版本?

时间:2012-04-25 19:37:05

标签: c# .net design-patterns

我需要在我的应用程序中使用轻量级和重量级的对象。

  • 轻量级对象只包含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检查。

修改 此对象模型正在客户端 - 服务器应用程序的客户端上使用。在我使用轻量级对象的情况下,我不想要延迟加载,因为这将浪费时间和内存(我已经在其他地方的客户端内存中有对象)

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

大多数ORM工具在延迟加载中完全按照您要求的方式执行 - 它们首先获取对象标识符,并在访问方法时,发出后续查询以加载相关对象。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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