Pregunta

Actualmente estoy escribiendo una solicitud financiera, y tenemos una tabla de clientes bastante estándar. Consiste en muchos campos obligatorios, y algunos opcionales como Cell / Fax, etc. Estoy usando NHibernate como ORM y tengo todas las asignaciones correctas. Ya funciona.

Me pregunto, ¿cómo puedo "expresar"? en el código que un campo no es nulo sin comentar? Tengo los archivos hbm.xml que documentan esto, pero es un poco incómodo verlos para cosas como esta.

La otra cosa que me viene a la mente es que no quiero que el repositorio arroje Excepciones de NHibernate en mi Lógica, por lo que tal vez debería seguir la ruta de validación en el Controlador. Aún así, ¿cómo puedo hacer que el código POCO exprese que algunos campos pueden ser nulos?

Diagrama de clase

Como puede ver, quiero que el teléfono celular y el fax sean opcionales mientras que el teléfono es obligatorio. Todos son solo mapeos compuestos, por lo que el archivo de mapeo solo especifica que los elementos individuales de cada uno deben ser no nulos, pero odio hacer la verificación Person.Cellular! = Null todo el tiempo para evitar tener una NullReferenceException.

¿Fue útil?

Solución

Hay algunas formas de hacerlo dependiendo de su comportamiento POCO y estilo de codificación. En primer lugar, podría usar tipos anulables para expresar que este campo es anulable y, por lo tanto, estaría implícito que el resto no puede anularse. Alternativamente, podría introducir un tipo de valor de teléfono como el tipo para la propiedad de teléfono de la POCO que ilustró, lo que implica que, dado que no es un tipo primitivo, es "más importante". - esto también le permitiría encapsular la validación del número de teléfono dentro de la clase misma.

En mi opinión, para ser un verdadero objeto POCO, no necesita preocuparse por la nulabilidad subyacente dentro de la tabla de la base de datos en la que se persigue ... en realidad debería tener tipos de validación y valor que expresen su comportamiento como una entidad independiente ; por lo tanto, antes de llegar a NHibernate ya está en un estado válido.

Otros consejos

Haga que las propiedades nulas sean de solo lectura y escríbalas a través de un constructor público. Haga que el constructor predeterminado sea protegido o privado.

public class DomainObject{
private string nnp;
protected DomainObject(){}
public DomainObject(string nnp){
this.nnp = nnp;
}
public string NotNullProp {get {return nnp;}}
public string NullableProp {get;set;} 
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top