ts-ioc-container 23.1.1 → 23.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/README.md +103 -7
  2. package/package.json +2 -2
package/README.md CHANGED
@@ -36,28 +36,124 @@ yarn add ts-ioc-container ts-constructor-injector reflect-metadata
36
36
 
37
37
 
38
38
  ## Injector
39
- How to create new container
39
+ As long as injector is not part of container, you can use any injector you want (simple, proxy, based on reflection).
40
+
41
+ ### Reflection injector (recommended)
40
42
 
41
43
  ```typescript
42
44
  import { Container, IContainer, IInjector, Provider } from "ts-ioc-container";
43
- import { resolve } from 'ts-constructor-injector';
45
+ import { inject, resolve } from "ts-constructor-injector";
46
+ import { by } from "ts-ioc-container/lib";
44
47
 
45
- class Logger {
48
+ const injector: IInjector = {
49
+ resolve<T>(container: IContainer, Target: constructor<T>, ...deps: unknown[]): T {
50
+ return resolve(container)(Target, ...deps);
51
+ },
52
+ };
53
+
54
+ class Logger implements ILogger {
46
55
  info(message: string) {
47
56
  console.log(message);
48
57
  }
49
58
  }
50
59
 
60
+ class App {
61
+ constructor(@inject(by('ILogger')) private logger: ILogger) {
62
+ }
63
+
64
+ run() {
65
+ this.logger.info('Hello world');
66
+ }
67
+ }
68
+
69
+ const container = new Container(injector)
70
+ .register('ILogger', Provider.fromClass(Logger));
71
+
72
+ const app = container.resolve(App);
73
+ app.run();
74
+ ```
75
+
76
+ ### Simple injector
77
+
78
+ ```typescript
79
+ import { IContainer } from "ts-ioc-container";
80
+
51
81
  const injector: IInjector = {
52
- resolve<T>(container: IContainer, value: constructor<T>, ...deps: unknown[]): T {
53
- return resolve(container)(value, ...deps);
82
+ resolve<T>(container: IContainer, Target: constructor<T>, ...deps: unknown[]): T {
83
+ return new Target(container, ...deps);
54
84
  },
55
85
  };
56
86
 
87
+ class Logger implements ILogger {
88
+ info(message: string) {
89
+ console.log(message);
90
+ }
91
+ }
92
+
93
+ class App {
94
+ private logger: ILogger;
95
+
96
+ constructor(private container: IContainer) {
97
+ this.logger = container.resolve('ILogger');
98
+ }
99
+
100
+ run() {
101
+ this.logger.info('Hello world');
102
+ }
103
+ }
104
+
57
105
  const container = new Container(injector)
58
106
  .register('ILogger', Provider.fromClass(Logger));
59
- const logger = container.resolve<ILogger>('ILogger');
60
- logger.info('Hello world');
107
+
108
+ const app = container.resolve(App);
109
+ app.run();
110
+ ```
111
+
112
+ ### Proxy injector
113
+
114
+ ```typescript
115
+ import { IContainer } from "ts-ioc-container";
116
+
117
+ const injector: IInjector = {
118
+ resolve<T>(container: IContainer, Target: constructor<T>, ...deps: unknown[]): T {
119
+ const args = deps.reduce((acc, it) => ({ ...acc, ...it }), {});
120
+ const proxy = new Proxy(
121
+ {},
122
+ {
123
+ // eslint-disable-next-line @typescript-eslint/ban-types
124
+ get(target: {}, prop: string | symbol): any {
125
+ // eslint-disable-next-line no-prototype-builtins
126
+ return args.hasOwnProperty(prop) ? args[prop] : container.resolve(prop);
127
+ },
128
+ },
129
+ );
130
+ return new Target(proxy);
131
+ },
132
+ };
133
+
134
+ class Logger implements ILogger {
135
+ info(message: string) {
136
+ console.log(message);
137
+ }
138
+ }
139
+
140
+ class App {
141
+ private logger: ILogger;
142
+
143
+ constructor({logger}: {logger: ILogger}) {
144
+ this.logger = logger;
145
+ }
146
+
147
+ run() {
148
+ this.logger.info('Hello world');
149
+ }
150
+ }
151
+
152
+ const container = new Container(injector)
153
+ .register('logger', Provider.fromClass(Logger));
154
+
155
+ const app = container.resolve(App);
156
+ app.run();
61
157
  ```
62
158
 
63
159
  ## Provider
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ts-ioc-container",
3
- "version": "23.1.1",
3
+ "version": "23.1.2",
4
4
  "description": "Typescript IoC container",
5
5
  "author": "ibabkin <igba14@gmail.com>",
6
6
  "homepage": "https://github.com/IgorBabkin/ts-ioc-container/tree/master/packages/ts-ioc-container",
@@ -48,5 +48,5 @@
48
48
  "ts-jest": "27.0.5",
49
49
  "typescript": "4.4.3"
50
50
  },
51
- "gitHead": "d90e2d60572b3756ec383a9855e1a6930dab1192"
51
+ "gitHead": "783b900a3880d8a6caab523c1187a2d1c428c51a"
52
52
  }