Some criticism of this article:
1. ElistIfPossible is very expensive because it uses the Reflection.
2. If we will look at the example Save method, that is intended to show the princple, we see that session is opened after a transaction is possible started. Usually, a connection is opened by Session object somewhere after opening of a session. This means that manual enlisting is not really necessary, because if connection provider supports distributed transactions and a connection is opened in scope of transaction, then the connection will be enlisted automatically.
3. It's better to create service class that implements IDisposable. It will enter a transaction context on creation and leave on disposing. Using of "using" construct is simplier, than "try - catch".
I was posting a text and sources for similar approach to the old wiki. Now it's here -
http://www.hibernate.org/363.html, but i don't see sources. If people need it, then i can repost them to the new wiki.