2010-11-17 9 views
6

Similar a esta pregunta: C# Constructor Design pero esta pregunta es levemente diferente.C# ¿Dónde cargar datos iniciales en un objeto?

Tengo un cliente de clase y un CustomerManager clase. Cuando se crea una instancia de la clase CustomerManager, quiero cargar todos los clientes. Y aquí es donde me quedé atrapado. Puedo hacer esto varias maneras:

  1. cargar todos los clientes en el constructor (no me gusta éste, ya que puede tomar un tiempo si tengo muchos clientes)
  2. En todos los métodos de la CustomerManager clase que lleva a cabo acciones relacionadas con bases de datos, comprobar la lista local de los clientes se carga y si no, se carga la lista:

    public method FindCustomer(int id) 
    { 
        if(_customers == null) 
        // some code which will load the customers list 
    } 
    
  3. crear un método que carga todos los clientes. Este método debe ser llamado antes de llamar a métodos que lleva a cabo acciones relacionadas con bases de datos:

    En la clase:

    public LoadData() 
    { 
        // some code which will load the customers list 
    } 
    

    En la forma:

    CustomerManager manager = new CustomerManager(); 
    manager.LoadData(); 
    Customer customer = manager.FindCustomer(int id); 
    

¿Cuál es la mejor manera de hacerlo ¿esta?

EDIT:

tengo la sensación de que estoy aquí entendido mal. Tal vez es porque no estaba lo suficientemente claro. En la clase CustomerManager tengo varios métodos que dependen de la lista local (_customers). Entonces, mi pregunta es, ¿dónde debería llenar esa lista?

+0

Cuando dijo "formulario", creo que importa si se refería a WebForm o WinForm; Implementaría cada uno de manera diferente, porque el almacenamiento en caché también está involucrado. Entonces, ¿a qué te refieres? – BeemerGuy

+0

Estoy usando winforms – Martijn

+0

Creo que necesita elaborar más (después de su EDIT). No está claro por qué la carga diferida no funcionará dentro de su clase 'CustomerManager', siempre que cambie' _customers' por 'Lazy' Customers' o 'Lazy ' y en su lugar se refiera a '_customers.Value'. –

Respuesta

9

Lo que está describiendo es "carga lenta".

Un enfoque simple es tener una propiedad privada como esto:

private Lixt<Customer> _customers; 
private List<Customer> Customers 
{ 
    get 
    { 
    if(_customers == null) 
     _customers = LoadData(); 
    return _customers; 
    } 
} 

A continuación, se refieren a Customers internamente. Los clientes se cargarán la primera vez que los necesiten pero no antes.

Este es un patrón tan común que .Net 4.0 agregó una clase Lazy<T> que hace esto por usted.

que ese caso, sólo lo definen como una empresa privada como esto:

private Lazy<List<Customer>> _customers = new Lazy<List<Customer>>(LoadData); 

A continuación, simplemente se refieren a sus clientes en el código:

_customers.Value 

La clase va a inicializar el valor con su método LoadData().

Si aún no está en .Net 4.0, la clase Lazy<T> es muy fácil de implementar.

+1

+1 por mostrarme 'Lazy '. – Heinzi

+0

Esto no es lo que quise decir, por favor vea mis ediciones. De todos modos +1 para el enfoque Lazy – Martijn

+0

Supongo que estoy confundido. ¿Por qué no puedes usar este enfoque en tu clase 'CustomerManager'? –

5

Utilice una propiedad para acceder a los clientes. Haga ese control si los clientes están cargados.

2

Bueno, depende. Todas sus opciones tienen ventajas y desventajas.

Lo bueno de las opciones 1 y 3 es que el usuario tiene control total sobre cuando se realiza la operación de carga de datos (larga). Si la opción 1 o 3 es mejor depende de si tiene sentido crear el Administrador y cargar los datos más tarde o no. Personalmente, prefiero un método diferente LoadData si es una operación prolongada, pero eso podría ser una cuestión de gusto.

Lo bueno de la opción 2 es que los datos no se cargarán si no es necesario. El inconveniente es que la carga (larga) se produce como un efecto secundario del primer acceso, lo que hace que su programa sea "menos determinista".

En principio, todas las opciones que ha presentado son buenas y válidas. Realmente depende de tus requisitos.

Cuestiones relacionadas