I use MVC but only as a convenient router to get the user request into my business layer which is a completely separate assembly altogether. So my controllers are really thin. They just execute authorization methods (which are also contained in my business assembly) and then call a method in my business layer that does the actual logic of the request. So I would have an API assembly that uses ASP.NET MVC but then a Business assembly. Each controller would basically be this:
public IActionResult DoSomeStuff([FromServices] MyAuthorizationService authorization, [FromServices] MyBusinessClass myBusiness) {
if (!authorization.CanDoThisThing()) {
return Forbid();
}
myBusiness.DoSomeStuff();
return Ok();
}
I've called this pattern MVCS where the S is for Service... the Service being my business layer. Though I have since developed a love hate relationship with the term service since it's usage as a word has been changed to mean anything that is dependency injected.
And the M isn't my domain models in this case. It's what gets serialized which usually is a variation of my domain models (See this video: https://www.youtube.com/watch?v=6KUheTnNY3M). The view would be the actual JSON that gets serialized if you're doing a SPA UI with all the AJAX.