You could provide a number of generic and agnostic attributes for use with dependency-injection solutions without enforcing any sort of contract or implementing structure. This would be achieved by only targetting things that we know will be used. These attributes could be used with auto-wiring or a compilation state that collects all the data for production deployment or something.
These attributes:
- Wouldn't enforce a particular implementation
- Wouldn't restrict the usage of the class
- Wouldn't even require DI.