2012-01-11 16 views
6

Por definición, las propiedades virtuales o los métodos son métodos visibles para las subclases que se deben anular. Pero, NHibernate, por ejemplo, utiliza propiedades virtuales para garantizar la carga diferida.propiedades virtuales y carga lenta

Mi pregunta no es sobre NHibernate, pero ¿cómo podría utilizar las propiedades virtuales para lograr la carga lenta? ¿Hay algún comportamiento oculto sobre las propiedades virtuales que no sé?

Respuesta

9

El hecho de que se declaren virtuales permite a NHibernate anular la propiedad y crear una implementación de proxy para ella, el proxy a su vez puede usar para implementar la carga diferida en el primer acceso de la propiedad.

+0

¿Nhibernate hereda su clase? –

+0

Sí, es por eso que necesita el 'virtual'. De esta forma, puede reemplazar su propiedad con código para recuperar los datos cuando se acceda. – ChrisAnnODell

+0

@ChrisAnnODell cómo una clase podría heredarse en tiempo de ejecución? No hay forma de lograr esto mediante la reflexión –

2

No hay un comportamiento oculto detrás de virtual miembros. Excepto el hecho no tan oculto de que pueden ser anulados en clases para niños.

La carga diferida se puede lograr utilizando la clase Lazy<T>. En que T es el tipo que se cargará. Se convertirá implícitamente a T.

O si desea configurar manualmente las propiedades de comportarse vago que podría utilizar algo como esto:

private SomeType _someProperty = null; 
public override SomeType SomeProperty 
{ 
    get 
    { 
     if (_someProperty == null) 
     { 
      // Load _someProperty 
     } 
     return _someProperty; 
    } 
} 

Con valuetypes se puede elegir para que sean Nullable<T>. O introduzca bool ya sea que estén cargados o no.

+0

¿Qué sucede si no tiene acceso a Lazy ? ¿Y cómo se puede lograr la pereza con virtual/override? Creo que esto es lo que OP significa. – oleksii

+0

Pereza manual. Déjame especificar eso. – Aidiakapi

Cuestiones relacionadas