The next level to this Hexagonal pattern would be to simplify it even further with generics.
“So that the services are only one.” - Breaking “directly” the SOLID principle.
Characters → GenericService <T, Request T , Result T > → GenericResponse <T, Request T , Result T > — Characters ← GenericService ← GenericResponse
Items → GenericService <T, Request T , Result T > → GenericResponse <T, Request T , Result T > — Items ← GenericService ← GenericResponse
But this would be applying an invented pattern of mine. I call it the “injective direct pattern.” I’m not very good at making up names. But hey, this would be for another publication that escapes this publication. But in summary it would be 1 single interface for everything, something like injecting anything at any time. (Sounds crazy right?)
and the next level to this generic model that I showed would be to use observers, callbacks, reflection… an endless number of things.