2012-10-02 20 views
13

Estoy jugando para intentar implementar un marco de aplicación que use RavenDB. Configuré un servicio de lógica de negocios, que tiene una relación de 1 a 1 con una sesión y se convierte en la abstracción de la unidad de trabajo.Cambios rastreados de RavenDB omite la validación

Parte del servicio de lógica de negocios sería contener toda la validación. Un método desde el servicio podría ser algo como

public void StoreUser(User user) 
    { 
     //Some validation logic 
     if(string.IsNullOrWhiteSpace(user.Name)) 
      throw new Exception("User name can not be empty"); 

     Session.Store(user); 
    } 

El problema es que debido a que el usuario se realiza un seguimiento tan pronto como se almacena puedo pasar por alto ninguna validación del método tienda, pero el almacenamiento de un valor correcto a continuación, cambiar más tarde

public void TestUserStore() 
    { 
     var u1 = new User() {Name = "John"}; 
     var u2 = new User() { Name = "Amy" }; 

     Service.StoreUser(u1); 
     u1.Name = null; //change is tracked and will persist on the next save changes 
     Service.StoreUser(u2); 
     Service.SaveChanges(); 

     //The following fails, as we have stored null as the name rather than "John" bypassing our validation 
     Assert.IsTrue(Service.AdhocQuery<User>().Any(u => u.Name == "John")); 

    } 

¿Hay alguna forma de hacer que RavenDB almacene solo una instantánea del artículo que se almacenó y no rastree más cambios? ¿Debería clonar todo lo que entra y sale del servicio de lógica de negocios para evitar actualizaciones ilegales? o estoy haciendo la validación en el lugar equivocado, ¿hay un lugar mejor para poner esta lógica?

Respuesta

12

Ponga su lógica de validación dentro de un IDocumentStoreListener antes de cada operación de guardar, puede hacer este tipo de verificación automáticamente.

He escrito más sobre este tema here.

+4

Gran punto de extensión, merece más publicidad de la que actualmente tiene en la documentación – Alex

+0

Gracias por su respuesta. –