What are some good practices for handling communication between a frontend and a backend?
From what I know in order to keep things loosely coupled you shouldn't just have your frontend have a reference to your backend and directly call it but use some sort of middle layer.
I'm a C# dev and I know of the Event Aggregator pattern, where the backend can say something like "I register this method with you under the key "whatever"." and the front can at any time say "I want to call the "whatever" methods." or something like that.
However after googling I wasn't able to find any alternatives and for simpler projects this pattern seems overly complicated.
What good practices are there for handling the frontend requesting the backend do some logic-heavy operation and the backend report progress to the front?