Magic means “hidden complexity”, AKA “abstraction”. The negative connotation is that sometimes you can’t figure out why your software is behaving a certain way and what you need to do about it.
The positive connotation is that you write less code with less cognitive overhead.
Generally I prefer ASP.NET over things like Spring and Ruby on Rails because it has less magic, despite being clearly inspired by both of those.
Here’s a concrete ASP.NET example:
You can put an [ApiController] attribute on your controllers and it can change the structure of error responses, among other things. [1]
I don’t agree with some of the other parent points. For example, the comments on “multiple dependency injection container” —- ASP.NET is pretty prescriptive on DI patterns. That sounds like someone made a decision to add complexity, which is on them.
So "non magic" means to write everything then? Because the example you showed you have to understand a language feature, attributes. Then see the source code, which is open, and how it's being used.
So, are Rust macros, or C macros, C++ templating magic or it's just means "I don't want to know how this works therefore it's magic"?
It seems you had a bad time learning ASP.NET, but in my experience what you're asking for is not difficult at all.
You have to:
1. [Optional] Define a DTO that deserializes { "foo" : { "bar" : "baz" }} to an object
2. Write a class that subclasses Controller
3. Write a method, call it whatever you want, that accepts a JObject or one of your DTO types.
4. Add the attribute [HttpPut("ping/pong/yolo")] to tell the framework this method should be bound to PUTs for that path.
5. Write your business logic.
No one in their sane mind would use ASP.NET for new projects (it is legacy and a business risk) nowadays so it's reasonable to assume that everyone means ASP.NET Core given the .NET 7 context.
The positive connotation is that you write less code with less cognitive overhead.
Generally I prefer ASP.NET over things like Spring and Ruby on Rails because it has less magic, despite being clearly inspired by both of those.
Here’s a concrete ASP.NET example: You can put an [ApiController] attribute on your controllers and it can change the structure of error responses, among other things. [1]
I don’t agree with some of the other parent points. For example, the comments on “multiple dependency injection container” —- ASP.NET is pretty prescriptive on DI patterns. That sounds like someone made a decision to add complexity, which is on them.
[1] https://stackoverflow.com/a/66546105