Necesito versiones de un objeto de peso ligero y pesado en mi aplicación.¿Hay un patrón de diseño para versiones ligeras y pesadas de un objeto?
- Un objeto liviano contendría solo campos ID, pero no instancias de clases relacionadas.
- Un objeto pesado debería contener ID e instancias de esas clases.
Aquí es una clase de ejemplo (para el propósito de la discusión solamente):
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;
}
}
¿Hay un buen patrón de diseño a seguir para lograr esto?
Puedo ver cómo se puede codificar en una sola clase (como mi ejemplo anterior), pero no es evidente de qué manera se está utilizando una instancia. Tendría que tener comprobaciones NULL en todo mi código.
Editar: Este modelo de objeto se está utilizando en el lado del cliente de la aplicación cliente-servidor. En el caso en el que estoy usando los objetos livianos, no quiero una carga lenta porque va a ser una pérdida de tiempo y memoria (ya tendré los objetos en la memoria del lado del cliente)
No siempre quiero cargar el objeto completo. Y a veces, ya tengo una instancia de esto, así que no necesito volver a cargar desde DB de todos modos. – TheSean
@TheSean No importa. Esa es precisamente la utilidad del patrón. Si necesita usarlos, entonces cárguelos, de lo contrario no. Ahora bien, si está hablando de no exponer las propiedades de versiones pesadas, es otra cosa, pero también se puede resolver usando (es decir, dos interfaces: la más liviana y la más pesada). –
Como ejemplo, digamos que tengo 1,000 pedidos, cada uno para el mismo producto. Con su sugerencia de cargar el objeto Product de forma perezosa, cargaría 1,000 instancias del mismo objeto. Esto es lo que quiero decir con pérdida de memoria. – TheSean