Is it possible to get all controllers available to a ControllerFactory?
What I want to do is get a list of all controller types in application, but in a consistent way.
So that all controllers I get are the same ones default request resolution is using.
(The actual task is to find all action methods that have a given attribute).
I don't think it's possible to give a simple answer to this question, because it depends on a lot of different things, including the implementation of IControllerFactory.
For instance, if you have a completely custom-built IControllerFactory implementation, all bets are off, because it may use any sort of mechanism to create Controller instances.
However, the DefaultControllerFactory looks after the appropriate Controller type in all the assemblies defined in the RouteCollection (configured in global.asax).
In this case, you could loop through all the assemblies associated with the RouteCollection, and look for Controllers in each.
Finding Controllers in a given assembly is relatively easy:
where
asm
is an Assembly instance.You can use reflection to enumerate all classes in an assembly, and filter only classes inherit from Controller class.
The best reference is asp.net mvc source code. Take a look of the implementations of ControllerTypeCache and ActionMethodSelector class. ControllerTypeCache shows how to get all controller classes available.
And ActionMethodSelector shows how to check if a method has desired attribute.