En mi capa de fachada de servicio, tengo una clase de servicio con un método/operación que acepta un objeto DTO (contrato de datos). AutoMapper se usa para asignar este DTO en una instancia de mi objeto de dominio para aplicar cualquier cambio. La solicitud se pasa a mi servicio de dominio que hace el trabajo real. Esto es lo que el método podría ser: propiedadesValidación con DDD en aplicación SOA usando IoC
public EntityContract AddEntity(EntityContract requestContract)
{
var entity = Mapper.Map<EntityContract, Entity>(requestContract);
var updatedEntity = Service.AddEntity(entity);
var responseContract = Mapper.Map<Entity, EntityContract>(updatedEntity);
return responseContract;
}
el servicio y Mapper se establecen mediante la inyección de constructor con Unity como el contenedor IoC.
En la realización de la operación, el servicio de dominio hace cambios a la entidad, entonces utiliza un repositorio para persistir los cambios como:
public Entity AddEntity(Entity entity)
{
// Make changes to entity
Repository.Add(entity);
// Prepare return value
}
El repositorio también se ajusta mediante la inyección de constructor.
El problema es que los datos quedan inmediatamente disponibles para otros clientes una vez que se han conservado, por lo que debo asegurarme de que no se conservan datos no válidos. He leído el "libro azul" de DDD (Evans) y Nilsson, y no tengo claro qué enfoque de validación debo tomar.
Si mi objetivo es evitar que la entidad entre en un estado no válido, ¿debo validar entityContract en mi método de servicio para asegurar que todas las reglas estén satisfechas antes de pasar la solicitud al servicio de mi dominio? Dudo en hacerlo porque parece que estoy rompiendo la encapsulación teniendo estas reglas definidas en la fachada del servicio.
La razón por la que estamos utilizando una delgada capa de fachada delegando a los servicios de dominio es que estamos exponiendo interfaces de curso en nuestra API, pero admitimos la reutilización a través de la composición de los servicios de dominio de grano fino. Teniendo en cuenta que los servicios de fachada múltiple pueden estar llamando al mismo método de servicio de dominio, tal vez sería mejor delegar estas reglas en el servicio de dominio para que sepamos que cada uso está validado. ¿O debería validar en ambos lugares?
También podría colocar protectores en los reguladores de propiedades que impiden que los valores inaceptables pongan la entidad en un estado no válido. Esto significaría que AutoMapper fallaría al tratar de asignar un valor no válido. Sin embargo, no ayuda cuando no se asigna ningún valor.
Todavía no puedo dejar de pensar que estas reglas son parte del comportamiento de la entidad y determinar si el objeto es válido debe ser encapsulado dentro de la entidad. ¿Esto esta mal?
Por lo tanto, primero debo determinar cuándo y dónde realizo estas comprobaciones de validación. Entonces necesito descubrir cómo implementar con DI para que las dependencias estén desacopladas.
¿Qué sugerencias puede proporcionar?
Los enlaces son geniales. Ahora me queda claro que la validación de tipo interactivo que permite al objeto entrar en un estado no válido y proporciona una lista de errores (a través de IDataErrorInfo, por ejemplo) pertenece a la capa de interfaz de usuario/presentación (ViewModel). Y estoy bien con poner guardias en mis objetos de dominio para evitar que pasen a un estado no válido. ¿Pero aboga usted también en contra de poner cheques en el servicio y/o capa de fachada a menos que abarquen múltiples entidades/agregados? – SonOfPirate
Puede agregar comprobaciones adicionales a los servicios y a la IU según sea necesario. Mi punto es que los objetos de dominio no deberían depender de estos controles. – Dmitry
@SonOfPirate: solo como una cuestión de interés, uso CodeContracts para imponer invariantes en mis objetos de dominio. – RobertMS