isessionfactory fluently nhibernate mapping automapper

fluently - nhibernate fluent mapping



Cómo simplemente asignar un NHibernate ISet a IList usando AutoMapper (2)

Estoy tratando de usar AutoMapper para mapear desde DTO a mi Dominio.

Mi DTO puede verse así:

public class MyDTO { public string Name { get; set; } public bool OtherProperty { get; set; } public ChildDTO[] Children { get; set;} } public class ChildDTO { public string OtherName { get; set; } }

Mi dominio objeta así:

public class MyDomain { public string Name { get; set; } public bool OtherProperty { get; set; } public ISet<ChildDomain> Children { get; set; } } public class ChildDomain { public string OtherName { get; set; } }

¿Cómo puedo configurar AutoMapper para que pueda mapear desde estos Array a Set? Parece que AutoMapper está tomando los Array y convirtiéndolos en IList y luego fallando en la conversión a ISet.

Aquí está la excepción

Unable to cast object of type ''System.Collections.Generic.List`1[DataTranser.ChildDTO]'' to type ''Iesi.Collections.Generic.ISet`1[Domain.ChildDomain]''.

Espero encontrar una forma genérica simple de hacer esto para poder minimizar la infraestructura necesaria para mapear desde DTO a Dominio. Cualquier ayuda es muy apreciada.



ACTUALIZAR:
Entonces, ¿cómo puedo modelar MyDomain -> ChildDomain sin terminar con un modelo de dominio anémico? Entiendo que sin lógica de negocio en MyDomain o ChildDomain, el modelo de dominio es actualmente anémico, pero el objetivo era agregar lógica empresarial a medida que avanzamos. Solo quiero asegurarme de que mi modelo de vista pueda traducirse al modelo de dominio y persistir.

¿Qué sugeriría para este escenario, pasar de una asignación simple entre vista y dominio y luego agregar reglas comerciales?

De nuevo, gracias por tu ayuda.


La respuesta:

  1. Debes crear tu propio IObjectMapper para mapear una colección personalizada como ISet
  2. Crea tu propia instancia de configuración con todos los ObjectMappers estándar y tu nuevo setobjectmapper.
  3. Utilice una instancia de IMappingEngine creada con la configuración con su propio ObjectMapper en lugar de la clase estática AutoMapper.Mapper.

Algunas observaciones:

  • Es fácil configurar la construcción de IMappingEngine en una inversión de contenedor de control.
  • La fuente de Automapper en sí podría ayudarle a crear la implementación de IObjectMapper.
  • Está utilizando el Automapper en el sentido opuesto para el que está diseñado: está diseñado para asignar objetos complejos a objetos simples. Intenta asignar un DTO simple a una entidad compleja. (Esto no significa que lo que desea es difícil de hacer con Automapper, pero puede tener problemas diferentes en el futuro)
  • Está utilizando el modelo de dominio anémico anti patrón. Dominio debe contener toda la lógica de negocios, por lo que no debe exponer una colección compleja como ISet (y ningún setter público para colecciones)

Si su capa de persistencia es simple, usar UseDestinationValue () le indicará a AutoMapper que no reemplace la colección subyacente:

ForMember (dest => dest.Children, opt => opt.UseDestinationValue ())

Sin embargo, si no es simple, simplemente hacemos la actualización manualmente en el dominio. La lógica generalmente se vuelve más compleja para actualizar el modelo de dominio. Hacer el mapeo inverso impone limitaciones a la forma de su modelo de dominio, que puede que no desee.