So you're both correct :)
Turbine out of the box registers all IController instances with the
container. The problem here is that an AsyncController is a Controller
and that when the original bits for Turbine were written (and ported
to MVC2) they didn't change or made that distinction :)
The logic within the (default) TurbineControllerFactory is check
whether the newly created controller instance is of type Controller.
If it is, then we ping the container for an IActionInvoker if one is
registered, we use it. Otherwise we use our default one (that provides
inferred actions, filter injection, etc.). As I mentioned earlier, an
AsyncController is a Controller so it passes the "are you of type
Controller?" check and gets an IActionInvoker assigned to it. However,
in order to make the "asynchronous" piece possible, the controller
needs an IAsyncActionInvoker (which it supplies to itself via the
CreateActionInvoker method).
So although Turbine is creating your controllers correctly, it is
assigning the wrong IActionInvoker to them and thus making them not
asynchronous. :( Again, all this code was there in MVC1 when
AsynControllers were not even around; so we'll change the code to
handle them in v2.2! :)
For now you can use this work-around for your controller/
asynccontroller co-habitation; it's a custom controller factory that
inherits from TurbineControllerFactory and performs the "if you're not
of type IAsyncController" logic -
http://gist.github.com/534787
The final solution will be slightly different than the one presented
but it will perform the same work. Sorry for this inconvenience and
thank you for bringing up this defect on the code and for checking out
MVC Turbine!
Also, if you do decide to try the code sample and run into any issues
please let me know!