"CommandBus" with Handlers & Observers
This is insanely nit-picky, but this is really just driving me nuts.


TResult Publish&lt;TCommand, TResult&gt;(TCommand command)



We read left to right from the return type to the name to the parameters, but you're ordered your generic types from param to result. I think this would be much easier to read as

TResult Publish&lt;TResult, TCommand&gt;(TCommand command)


It keeps the declaration closer to its use. Which is, admittedly, trivial in this case, but I think it makes the signature read more like a sentence.

On another note though, I really like that you're filtering the acceptable types. It reminds me that I need to do this more often myself. It's better than just trusting that you (or someone else most likely) knows what kind of types are okay to use generically.