I have to send an email, write to a file, and call a web service. To maintain consistency, all steps must happen. If any step throws an exception or errors out, all steps must be rolled back.
Before I go rolling my own object ACID engine, are there any commonly accepted patterns for implementing ACID semantics at the object level?
Better yet, are there any existing libraries I can use for the the .NET platform?
Edit: I know sending an email can't be undone, but failing to connect to the SMTP server is cause to kill the whole transaction. Also, I'd like this to be extensible for use with future actions.