From 6e6a521c1f7b7906d8d47269a0d3b848677eef6b Mon Sep 17 00:00:00 2001 From: Max P Date: Fri, 23 Aug 2024 17:49:06 +0200 Subject: [PATCH] feat: Update Identifier documentation in TypeScript --- src/types/Identifier.ts | 40 ++++++++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/src/types/Identifier.ts b/src/types/Identifier.ts index 6492bf1..495b8f1 100644 --- a/src/types/Identifier.ts +++ b/src/types/Identifier.ts @@ -1,11 +1,35 @@ /** - * The dependency identifier. - * You can use any string as identifier. - * To create order, it is also possible to - * provide these with a separator: `GroupA.ClassZ`. - * The convection for naming is as follows: - * The name should generally correspond to the interface that is relevant. - * I.e. a class `ClassA` that implements the interface `IClassA` and is - * registered as a dependent class is registered under the interface name `IClassA`. + * ## The dependency identifier + * + * You can use any string or Symbol as identifier. The identifier is used to + * register a class in the TSinjex DI (Dependency Injection) container. + * See **Hierarchical identifiers** for more information on `.` in identifiers. + * + * ### Hierarchical identifiers + * To create hierarchical identifiers, you can use a dot `.` as a separator. + * E.g. `Parent.Child` or `Parent.Child.Grandchild`. + * + * ### Merge functionality + * You can merge multiple dependencies into one by resolving them with + * a identifier that is a prefix of the actual identifiers. + * E.g. `Parent` resolves `Parent.*` and returns a mixin of all children. + * Merging will only work, if the main identifier is not registered. + * Grandchildren are not included in the mixin but you can use something like + * `Parent.Child.Grandchild` to merge all direct children of Grandchild, + * e.g. `Parent.Child.Grandchild.*`. + * If you don't want to allow merging, you must register the dependencies + * with the full identifier. E.g. `Parent` or `Parent.Child.Grandchild`. + * + * ### Naming convention + * The name of a dependency should generally correspond to the interface that is implemented. + * E.g. a class `ClassA` that implements the interface `IClassA` and is registered + * as a dependent class is registered under the interface name `IClassA`. + * + * The mixin parts of the class are registered under the interface name `IClassA.*`. + * E.g. `IClassA.IClassZ`, `IClassA.IClassY`, etc. + * + * #### Static/Constructor Identifier naming + * The identifier for a static or constructor dependency should be the same as the class name + * postfixed with `_`. E.g. `IClassA_` for the the static or constructor interface of class `IClassA`. */ export type Identifier = string | symbol;