A while ago Patrick Smacchia posted an analyses of NHibernate 2.0 in NDepends. Go read it, it is interesting, not only because it gives an insight about how to utilize NDepends, but also as a good indication of problematic areas inside NHibernate.
The NHibernate code base is aimed at solving a very complex problem, and I will be the first to admit that there are a lot of improvements that I would be delighted to do if I had infinite time to do so. In fact, some places of the code annoy me to the point where I make a point of putting them up in this blog as an example of what not to do.
The main problem is that, as I said, NHibernate is aimed at solving a very complex problem. And we already know that you can't escape complexity. Where I think NHibernate is making a great job is in dealing with this complexity for you, and making sure that your code is clean and clear.
As such, I can live with imperfections in the code, for as long as I don't hit them. When I do, I take out the hammer and deal with them. But the #1 criterion for the NHibernate code base is that we will make a whole lot of effort to ensure that the client code is clean.
As long as we manage to do that, we are doing a good job.