I think that the second option loses the essence of having specialized commands. You could as well rename DeleteProjectLogCommand
to CRUDCommand
. Furthermore, you are kind of restricting the capabilities of your implementation by introducing a generic DataDto
payload into ICommand
which by the way, might not be needed in many cases. And your ProjectDto
is taking care of what should be your command properties.
I'd stick with your first option. Even more, I'd probably get rid of IDeleteProjectCommand
to keep it simpler.