We’re developing quite a big application using ASP.NET MVC and at the beginning we saw that could be useful to have an abstract base controller with common CRUD actions (new, save, delete…) plus a default list action. In our case we have 20+ entities that are managed through this kind of controllers.
That works and avoids duplicating some code and makes the application more homogeneous but when you see a Controller is difficult to see exactly which actions does it implement and it may implement some actions that should not exist. And for example, imagine you want to edit passing the name and not the id, you have to create a new EditByName(name) and even doing that, you still have the Edit(id) action available because it’s in the base.
To me the whole thing smells a little bit to me but I’ve not found any example showing an alternative because the MVC applications I see have a pretty narrow domain. Any advise? Any example? (I does not necessarily be in ASP.NET MVC, the problem I think is quite generic to any MVC framework).
In some respects I think this is a good idea, but in others I think that it’s an abuse of inheritance. I do have a common base controller, but it exists because I’ve refactored common code from my controllers into it rather than being designed a priori. If your entities are enough alike that the code that you’re sharing in the base controller outweighs the cruft that you’re forced to drag around, then perhaps it’s worth it. If, on the other hand, the code that’s being shared is rather minimal and simply invokes a private abstract method that does the work (so that you’re implementing it in the real controller anyway), I don’t know what it buys you. It’s not like you’re instantiating your controllers directly anyway (except in your tests) so having a common interface beyond that required by the framework isn’t all that important.
My vote would be to refactor into the base class those things that are truly common or are cross-cutting concerns and not try to force an “is-a” relationship that may not really exist.