1) Para un método como GetAll(), ¿devuelvo IQueryable o IQueryable? Si devuelvo viewmodels, ¿cómo puedo lidiar con GetAll() que extrae miles de registros?
IQueryable<Entity>
. El repositorio no trata con modelos de vista. Piense en el repositorio como algo que se define en una biblioteca de clases separada que no hace referencia a su aplicación ASP.NET MVC, que es donde viven sus modelos de vista. Es la aplicación ASP.NET MVC que hace referencia a esta biblioteca.
2) ¿Creo un constructor para mi clase personalizada de ViewModel que toma la Entidad como un parámetro para hacer la asignación? (Todavía estoy familiarizado con AutoMapper por lo que sólo necesita un entendimiento sobre cómo hacer esto desde un punto de vista del diseño)
No. No crear constructores en sus modelos de vista sobre todo si quieres que las acciones del controlador de tome esos modelos de vista como parámetros de acción (piense en una acción POST). La razón de esto es que la carpeta de modelo predeterminada ya no sabrá cómo crear una instancia de su modelo de vista y tendrá que escribir carpetas de modelo personalizadas.
So AutoMapper o mapa manualmente.
Ejemplo con el mapeo manual, que es lo que se podría comenzar con:
public ActionResult SomeAction()
{
IEnumerable<Entity> entities = Repository.GetAll();
IEnumerable<MyViewModel> model = entities.Select(x => new MyViewModel
{
Prop1 = x.Prop1,
Prop2 = x.Prop2,
...
});
return View(model);
}
Y una vez que se enferma de escribir este código de movimiento para AutoMapper:
public ActionResult SomeAction()
{
IEnumerable<Entity> entities = Repository.GetAll();
IEnumerable<MyViewModel> model = Mapper.Map<IEnumerable<Entity>, IEnumerable<MyViewModel>>(entities);
return View(model);
}
o si se escribe una acción personalizada filtro que usa el evento OnActionExecuted para extraer el modelo de dominio que se pasó a la vista, asignarlo al modelo de vista utilizando AutoMapper y sustituir el modelo con el modelo de vista para la vista, puede simplificar aún más el código repetitivo:
[AutoMap(typeof(IEnumerable<Entity>), typeof(IEnumerable<MyViewModel>))]
public ActionResult SomeAction()
{
IEnumerable<Entity> entities = Repository.GetAll();
return View(entities);
}
Una vez más, mi principal preocupación es un método como GetAll() que tirar de muchos registros. Si hice un bucle foreach para traducir cada entidad a un ViewModel parece una gran sobrecarga.
No se preocupe por eso. Tirando de sus registros será una magnitud más lenta que el bucle y la asignación al modelo de vista.