Nella nostra applicazione ASP.NET MVC, proviamo davvero a separare le preoccupazioni da ogni livello (usiamo DDD). Tuttavia, sembra che non possiamo evitare di avere almeno qualche logica di business in DAL.
Per esempio, ci sono oggetti con nome, in cui i requisiti aziendali sono che ogni nome deve essere univoco (ma il nome non è una chiave). Se c'è una richiesta per creare un nuovo oggetto con nome, il servizio controlla se qualche oggetto con quel nome esiste nel repository, se non lo fa, fabbrica crea un nuovo oggetto e il repository lo mantiene (usiamo EF per i repository e le stored procedure per gli oggetti query ).
Il problema è con le condizioni di gara - se due richieste vengono contemporaneamente (è improbabile, ma possibile), entrambe le richieste vogliono creare un nuovo oggetto con lo stesso nome, in questo caso entrambi i controlli risultano negativi e due oggetti con lo stesso nome sarebbe stato creato Finora, lo gestiamo con vincoli nel database SQL, quindi se succede qualcosa del genere, un'eccezione viene gettata nel repository - ma questo approccio è semplicemente sbagliato, dal momento che tale requisito è strettamente richiesto dal business e non dovrebbe creare bolle al livello di persistenza; se cambiamo tale requisito, ad es. i nomi diventano maiuscole e minuscole, tale vincolo dovrebbe anche essere modificato, ecc.).
Come implementare correttamente tale scenario? Grazie.