.net nhibernate remoting

.net - NHibernate IList a la lista



remoting (3)

Hola, estoy tratando de devolver una colección de dominio de construcción.

private long _id; private string _buildingName; private IList<BasicRoom> _rooms;

Estoy usando NHibernate y este mapeo para las habitaciones

<bag name="rooms" table="tb_rooms" lazy="false"> <key column="buildingID"/> <one-to-many class="Room"/> </bag>

Y estoy llamando al DB así;

Buildings = (List<Building>)session.CreateCriteria(typeof(Building)).AddOrder(Order.Asc("buildingName")).List<Building>();

El problema es que no quiero que la colección _rooms sea IList pero necesito que sea una lista. Por desgracia, NHibernate requiere que use una interfaz para colecciones. Alguna idea de cómo hacer esto. Soy nuevo en .Net y pienso que tal vez dejar NHibernate sea el camino a seguir. Solo necesito que la colección se escriba como una lista para poder continuar. Cualquier ayuda muy apreciada.


¿Por qué necesita un objeto List concreto, cuando puede hacer todo lo que quiera con un IList ?

Si tiene que ser una lista concreta, tienes dos opciones.

Primero, simplemente lanza el IList<Building> a List<Building> . Esto solo funcionará si el tipo subyacente es una List<Building> , que personalmente dudo.

En segundo lugar, llame al método de extensión ToList () en él:

Buildings = (List<Building>)session.CreateCriteria(typeof(Building)).AddOrder(Order.Asc("buildingName")).List<Building>().ToList();

Personalmente recomiendo que no haga ninguno de los dos y use IList en su lugar.


¿Qué le IEnumerable<T> usar el constructor de List<T> que toma un IEnumerable<T> ? Entonces puedes usar:

Buildings = new List<Building>(session.CreateCriteria(typeof(Building)).AddOrder(Order.Asc("buildingName")).List<Building>());


Así no es como funciona NHibernate. No puede decir cuáles son los tipos concretos de los objetos de su modelo de dominio. Solo puede contarle cuáles son los tipos de base y las interfaces. Luego, elige cómo implementar los tipos de dominio de manera eficiente.

Por ejemplo, NHibernate utiliza su propia implementación interna de IList<T> que sabe cómo hacer la carga diferida.

Además, NHibernate usa su propia implementación interna de Building desde su modelo de dominio. No es necesariamente el caso que todos los objetos de Building que utilizará con NHibernate tendrán, como su tipo concreto, Building . Solo es cierto que serán Building s, ya sea que Building sea ​​el tipo concreto de su objeto, o si es el tipo base del tipo concreto de su objeto.

Pero esto es lo correcto , ya que se supone que debes usar interfaces y tipos base en lugar de tipos concretos de todos modos. NHibernate te ayuda a utilizar todos los enfoques correctos de programación.

Ahora, ¿por qué necesita una List<Building> per se? ¿Por qué IList<Building> no es suficiente?