diff --git a/contribute/architecture/backend/package-hierarchy.md b/contribute/architecture/backend/package-hierarchy.md new file mode 100644 index 000000000000..47daab6aa578 --- /dev/null +++ b/contribute/architecture/backend/package-hierarchy.md @@ -0,0 +1,16 @@ +# Package hierarchy + +The Go package hierarchy in Grafana should be organized logically (Ben Johnson's +[article](https://medium.com/@benbjohnson/standard-package-layout-7cdbc8391fc1) served as inspiration), according to the +following principles: + +* Domain types and interfaces should be in "root" packages (not necessarily at the very top, of the hierarchy, but + logical roots) +* Sub-packages should depend on roots - sub-packages here typically contain implementations, for example of services + +## Practical example + +The `pkg/plugins` package contains plugin domain types, for example `DataPlugin`, and also interfaces +such as `RequestHandler`. Then you have the `pkg/plugins/managers` subpackage, which contains concrete implementations +such as the service `PluginManager`. The subpackage `pkg/plugins/backendplugin/coreplugin` contains `plugins.DataPlugin` +implementations.