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

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

4

4 回答 4

3

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

于 2012-04-25T19:45:13.180 回答
2

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

大多数 ORM 工具正是您在延迟加载中寻找的功能——它们首先获取对象标识符,然后在访问方法时发出后续查询以加载相关对象。

于 2012-04-25T19:40:47.017 回答
0

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

于 2012-04-26T09:36:51.943 回答
0

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

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

于 2012-04-25T20:14:41.597 回答