2012-04-25 12 views
6

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)

Respuesta

2

Tenga ¿Consideró usar una herramienta ORM como NHibernate para acceder a DB? Si usa algo como NHibernate, obtendría este comportamiento mediante la carga diferida.

La mayoría de las herramientas ORM hacen exactamente lo que está buscando dentro de la carga diferida: primero obtienen los identificadores de objeto y, al acceder a un método, emiten consultas posteriores para cargar los objetos relacionados.

3

Inicialización lenta, Virtual Proxy y Ghost son tres implementaciones de ese patrón de carga diferida. Básicamente se refieren a las propiedades de carga una vez que las necesita. Ahora, supongo que utilizará algún repo para almacenar objetos, por lo que le recomendaré que utilice cualquiera de las herramientas ORM disponibles. (Hibernate, Entity Framework, etc.), todos implementan estas funciones gratis para usted.

+0

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

+1

@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). –

+0

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

0

Parece que podría necesitar un objeto de transferencia de datos (DTO), simplemente una clase de contenedor "tonto" que resume una entidad comercial. Usualmente uso algo así cuando necesito aplanar un objeto para mostrar. Tenga cuidado, sin embargo: el uso excesivo da como resultado un antipatrón.

Pero representar un objeto para mostrar es diferente de limitar los hits contra la base de datos. Como señala Randolph, si su intención es la última, utilice uno de los patrones de carga diferida existentes, o mejor aún, use un ORM.

0

Eche un vistazo al patrón registry, puede usarlo para encontrar objetos y también para administrar mejor estos objetos, como mantenerlos en un caché.

Cuestiones relacionadas