We have several plugins registered at the PreValidation event, although this is a package, not an online one.
I myself did not write these specific plugins, but I can describe them and justify using PreValidation rather than PreOperation.
Object: Account
Event: Delete
Logic: the plugin runs a preliminary check. Checks for contacts that link to any of the account addresses. If any of them are found, stop execution. If not, delete the account.
eg.
The Stackoverflow account has a Jeff Attwood House address and a glosrob contact. "glosrob" refers to "Jeff Attwood House" through customization. If the user chooses to delete "StackOverflow", we must find that "glosrob" refers to the address and prevents the removal.
The reason for this was that the developer discovered that at the PreOperation stage some aspects of the deletion had already occurred, namely, the cascade deletes. The logic of the plugin requires us to check all contacts - by registering with PreOperation, the contacts from the account have already been deleted, which makes the check obsolete.
In our previous scenario, when the user chose to delete the "StackOverflow" account, the "glosrob" "Contact" will be deleted before the plugin starts. Therefore, when the plugin was subsequently launched, it allowed removal.
As in most cases in CRM, it all comes down to requirements and solutions, but I think this gives you an idea of why / when you can use the PreValidation phase. We have several others with similar reasoning that fire in the "Delete" event.
source share