I used to use a single implementation protocol just to have a bunch of functions with the same convenient context from the enclosing record, like a db connection, config etc. I'm still not sure how to do that without records, but I don't need this anymore for some reason. Maybe I got used to passing context to functions, or maybe using the component lib more made this go away.
The component library doesn't require that components be records: If the component has no lifecycle of its own, you can use a plain map.