Gram dookoła próbując uzyskać framework aplikacji, który używa RavenDB. Ustanowiłem usługę logiki biznesowej, która ma relację 1 do 1 z sesją i skutecznie staje się jednostką abstrakcji pracy.RavenDB śledził zmiany pomija sprawdzanie poprawności
Częścią usługi logiki biznesowej będzie kontrola wszystkich walidacji. Sposób z usługi może być coś jak
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);
}
Problem jest, że ponieważ użytkownik jest śledzony tak szybko, jak jest on przechowywany mogę ominąć żadnej oceny metody przechowywania lecz przechowywania prawidłową wartość, a następnie zmieniając go później
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"));
}
Czy jest jakiś sposób, aby RavenDB przechował tylko migawkę przechowywanego przedmiotu i nie śledzi dalszych zmian? Czy powinienem klonować wszystko, wchodząc i wychodząc z usługi logiki biznesowej, aby zapobiec nielegalnej aktualizacji? lub czy dokonuję walidacji w niewłaściwym miejscu, czy istnieje lepsze miejsce na umieszczenie tej logiki?
Doskonały punkt rozszerzenia, zasługuje na większą reklamę niż obecnie na dokumentacji – Alex
Dzięki za odpowiedź. –