Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/zhouhoujun/tsioc
AOP, Ioc container, Boot framework, unit testing framework , activities workflow framework.
https://github.com/zhouhoujun/tsioc
activities activity aop boot bootstrap build-tool decorators framework ioc ioc-container pack type type-ioc typescript typescript-decorators unit unit-test unittest workflow
Last synced: about 1 month ago
JSON representation
AOP, Ioc container, Boot framework, unit testing framework , activities workflow framework.
- Host: GitHub
- URL: https://github.com/zhouhoujun/tsioc
- Owner: zhouhoujun
- License: mit
- Created: 2017-11-14T04:39:38.000Z (about 7 years ago)
- Default Branch: master
- Last Pushed: 2024-11-28T10:17:14.000Z (2 months ago)
- Last Synced: 2024-12-01T05:04:29.973Z (2 months ago)
- Topics: activities, activity, aop, boot, bootstrap, build-tool, decorators, framework, ioc, ioc-container, pack, type, type-ioc, typescript, typescript-decorators, unit, unit-test, unittest, workflow
- Language: TypeScript
- Homepage:
- Size: 16.9 MB
- Stars: 18
- Watchers: 1
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# packaged @tsdi/ioc
This repo is for distribution on `npm`. The source for this module is in the
[main repo](https://github.com/zhouhoujun/tsioc).`@tsdi/ioc` is Ioc container, Injector, via typescript decorator.
version 5+ of [`@ts-ioc/core`](https://www.npmjs.com/package/@ts-ioc/core) [`tsioc`](https://www.npmjs.com/package/tsioc)
# builder
```shell
build: npm run build//build with version:
npm run build -- --setvs=4.0.0-beta//deploy:
./deploy.cmd
//or
npm run build -- --deploy=true```
# Install
```shell
npm install @tsdi/ioc
```
## add extends modules
### use aop
```shell
// install aop
npm install @tsdi/aop```
```ts
import { AopModule } from '@tsdi/aop';
import { IocContainer } from '@tsdi/ioc';let container = new IocContainer();
// use aop.
container.use(AopModule);
// also can
container.register(AopModule);
// or
container.inject(AopModule)
//or
container.injectModule(AopModule)```
### use aop logs
```shell
// install aop logs
npm install @tsdi/logs
``````ts
import { LogModule } from '@tsdi/logs';
// in server
import { ContainerBuilder } from '@tsdi/platform-server'
// in browser
import { ContainerBuilder } from '@tsdi/platform-browser'let builder = new ContainerBuilder();
let container = build.create();
container.use(LogModule);
```
# Documentation
## core
### extends ioc
1. `@IocExt` class decortator, use to define the class is Ioc extends module. it will auto run after registered to helper your to setup module.
2. add service resolve.
3. module inject.## Ioc
1. Register one class will auto register depdence class (must has a class decorator).
2. get Instance can auto create constructor param. (must has a class decorator or register in container).
### decorators
1. `@Abstract` abstract class decorator.
2. `@AutoRun` class, method decorator, use to define the class auto run (via a method or not) after registered.
3. `@AutoWried` property or param decorator, use to auto wried type instance or value to the instance of one class with the decorator.
4. `@Inject` property or param decorator, use to auto wried type instance or value to the instance of one class with the decorator.
5. `@Injectable` class decortator, use to define the class. it can setting provider to some token, singleton or not.
6. `@AutoWried` method decorator.
7. `@Param` param decorator, use to auto wried type instance or value to the instance of one class with the decorator.
8. `@Singleton` class decortator, use to define the class is singleton.
9. `@Providers` Providers decorator, for class. use to add private ref service for the class.
10. `@Refs` Refs decorator, for class. use to define the class as a service for target.## AOP
It's a dynamic aop base on ioc.
define a Aspect class, must with decorator:
* `@Aspect` Aspect decorator, define for class. use to define class as aspect. it can setting provider to some token, singleton or not.
* `@Before(matchstring|RegExp)` method decorator, aop Before advice decorator.
* `@After(matchstring|RegExp)` method decorator, aop after advice decorator.
* `@Around(matchstring|RegExp)` method decorator, aop around advice decorator.
* `@AfterThrowing(matchstring|RegExp)` method decorator, aop AfterThrowing advice decorator.
* `@AfterReturning(matchstring|RegExp)` method decorator, aop AfterReturning advice decorator.
* `@Pointcut(matchstring|RegExp)` method decorator, aop Pointcut advice decorator.
see [simples](https://github.com/zhouhoujun/tsioc/tree/master/packages/aop/test/aop)
## boot
DI Module manager, application bootstrap. base on AOP.* `@DIModule` DIModule decorator, use to define class as DI Module.
* `@Bootstrap` Bootstrap decorator, use to define class as bootstrp module.
* `@Annotation` Annotation decorator, use to define class build metadata config.
* `@Message` Message decorator, for class. use to define the class as message handle register in global message queue.[mvc boot simple](https://github.com/zhouhoujun/type-mvc/tree/master/packages/simples)
```ts
import { DIModule, BootApplication } from '@tsdi/boot';
export class TestService {
testFiled = 'test';
test() {
console.log('test');
}
}@DIModule({
providers: [
{ provide: 'mark', useFactory: () => 'marked' },
TestService
],
exports: []
})
export class ModuleA {}
@Injectable
export class ClassSevice {
@Inject('mark')
mark: string;
state: string;
start() {
console.log(this.mark);
}
}@Aspect
export class Logger {@Around('execution(*.start)')
log() {
console.log('start........');
}
}@DIModule({
imports: [
AopModule,
ModuleA
],
providers:[
Logger,
ClassSevice
]
bootstrap: ClassSevice
})
export class ModuleB {}
BootApplication.run(ModuleB);
```
## components
* `@Component` Component decorator, use to defaine class as component with template.
* `@Input` Input decorator, use to define property or param as component binding field or args.see [ activity build boot simple](https://github.com/zhouhoujun/tsioc/blob/master/packages/activities/taskfile.ts)
## [Activites](https://github.com/zhouhoujun/tsioc/tree/master/packages/activities)
* [activities](https://github.com/zhouhoujun/tsioc/tree/master/packages/activities)
* [pack](https://github.com/zhouhoujun/tsioc/tree/master/packages/pack)### create Container
```ts
let container = new IocContainer();
```
### Container is ioc root.
see @tsdi/ioc interface [IIocContainer](https://github.com/zhouhoujun/tsioc/blob/master/packages/ioc/src/IIocContainer.ts)
see @tsdi/core interface [IContainer](https://github.com/zhouhoujun/tsioc/blob/master/packages/core/src/IContainer.ts)
```ts
// 1. register a class
container.register(Person);// 2. register a factory;
container.register(Person, (container)=> {
...
return new Person(...);
});// 3. register with keyword
container.register('keyword', Perosn);// 4. register with alais
container.register(new Registration(Person, aliasname));// register singleton
container.registerSingleton(Person)// bind provider
container.bindProvider
// bind providers.
container.bindProviders```
### Injector is basic ioc injector.
see interface [IInjector](https://github.com/zhouhoujun/tsioc/blob/master/packages/ioc/src/IInjector.ts)
```ts
// get the injector of Person class type injected.
let injector = container.getInjector(Person);// create new injector
let injector = container.createInjector();
// or create new injector via
let injector = container.getInstance(InjectorFactoryToken);
```### Invoke method
you can use yourself `MethodAccessor` by implement IMethodAccessor, register `MethodAccessorToken` with your `MethodAccessor` in container, see [interface](https://github.com/zhouhoujun/tsioc/blob/master/packages/ioc/src/IIocContainer.ts).
```ts
@Injectable
class Person {
constructor() {}
say() {
return 'I love you.'
}
}@Injectable
class Child extends Person {
constructor() {
super();
}
say() {
return 'Mama';
}
}class MethodTest {
constructor() {}
@AutoWried
sayHello(person: Person) {
return person.say();
}
}class MethodTest2 {
constructor() {}
@AutoWried()
sayHello( @Inject(Child) person: Person) {
return person.say();
}
}class MethodTest3 {
constructor() {}
@AutoWried
sayHello( @Inject(Child) personA: Person, personB: Person) {
return personA.say() + ', ' + personB.say();
}
}@Injectable
class Geet {
constructor(private name: string){}
print(hi?:string){
return `${hi}, from ${this.name}`;
}
}container.register(Geet);
container.invoke(Geet, gt=> gt.print, ... //inject providers.)
let instance = container.resolve(Geet, )
container.invoke(instance, gt=> gt.print, ...//inject providers.);
container.invoke(instance, 'print', ...);container.register(MethodTest);
container.invoke(MethodTest, 'sayHello');container.register(MethodTest2);
container.invoke(MethodTest2, tg=> tg.sayHello);container.register(MethodTest3);
container.invoke(MethodTest3, 'sayHello');```
## Use Demo
```ts
import { Method, ContainerBuilder, AutoWired, Injectable, Singleton, IContainer, ParameterMetadata, Param, Aspect } from '@tsdi/core';
export class SimppleAutoWried {
constructor() {
}@AutoWired
dateProperty: Date;
}@Singleton
export class Person {
name = 'testor';
}
// > v0.3.5 all class decorator can depdence.
@Singleton
// @Injectable
export class RoomService {
constructor() {}
@AutoWired
current: Date;
}@Injectable()
export class ClassRoom {
constructor(public service: RoomService) {}
}export abstract class Student {
constructor() {
}
abstract sayHi(): string;
}@Injectable({ provide: Student })
export class MiddleSchoolStudent extends Student {
constructor() {
super();
}
sayHi() {
return 'I am a middle school student';
}
}@Injectable()
export class MClassRoom {
@AutoWired(MiddleSchoolStudent)
leader: Student;
constructor() {}
}@Injectable({ provide: Student, alias: 'college' })
export class CollegeStudent extends Student {
constructor() {
super();
}
sayHi() {
return 'I am a college student';
}
}@Injectable
export class CollegeClassRoom {
constructor(
@Param(CollegeStudent)
@AutoWired(CollegeStudent)
public leader: Student) {}
}@Injectable
export class InjMClassRoom {
// @Inject(MiddleSchoolStudent)
@Inject
// @Inject({ type: MiddleSchoolStudent })
// @Inject({ provider: MiddleSchoolStudent })
leader: Student;
constructor() {}
}export interface IClassRoom {
leader: Student;
}@Injectable
export class InjCollegeClassRoom {
constructor(
// all below decorator can work, also @AutoWired, @Param is.
// @Inject(new Registration(Student, 'college')) // need CollegeStudent also register.
@Inject(CollegeStudent)
// @Inject({ provider: CollegeStudent })
// @Inject({ provider: Student, alias: 'college' }) //need CollegeStudent also register.
// @Inject({ type: CollegeStudent })
public leader: Student
) {}
}@Injectable
export class InjCollegeAliasClassRoom {
constructor(
// all below decorator can work, also @AutoWired, @Param is.
@Inject(new Registration(Student, 'college')) // need CollegeStudent also register.
// @Inject(CollegeStudent)
// @Inject({ provider: CollegeStudent })
// @Inject({ provider: Student, alias: 'college' }) // need CollegeStudent also register.
// @Inject({ type: CollegeStudent })
public leader: Student
) {}
}@Injectable('StringClassRoom')
export class StingMClassRoom {
// @Inject(MiddleSchoolStudent)
@Inject
// @Inject({ type: MiddleSchoolStudent })
leader: Student;
constructor() {}
}export class StringIdTest {
constructor(@Inject('StringClassRoom') public room: IClassRoom) {}
}export const CollClassRoom = Symbol('CollegeClassRoom');
@Injectable(CollClassRoom)
export class SymbolCollegeClassRoom {@Inject(CollegeStudent)
leader: Student;
constructor() {}
}export class SymbolIdest {
@Inject(CollClassRoom)
public room: IClassRoom
constructor() {}
}@Injectable
class MethodTestPerson {
say() {
return 'hello word.'
}
}class MethodTest {
@AutoWried
sayHello(person: MethodTestPerson) {
return person.say();
}
}// 1. Custom register one class will auto inject depdence class (must has a class decorator).
let builder = new ContainerBuilder();
let container = builder.create();container.register(MethodTest);
container.invoke(MethodTest, 'sayHello')
.then(data =>{
console.log(data);
});container.register(SimppleAutoWried);
let instance = container.get(SimppleAutoWried);
console.log(instance.dateProperty);container.register(ClassRoom);
let room = container.get(ClassRoom);
console.log(room.service.current);container.register(MiddleSchoolStudent);
container.register(CollegeStudent);let student = container.get(Student);
console.log(student.sayHi());let student2 = container.get(new Registration(Student, 'college'));
console.log(student2.sayHi());
let student3 = container.get(Student, 'college'));
console.log(student3.sayHi());
builder.build({
files: __dirname + '/*{.ts,.js}'
})
.then(container => {
let instance = container.get(Student);
console.log(instance.sayHi());let instance2 = container.get(new Registration(Student, 'college'));
console.log(instance2.sayHi());let instance3 = container.get(Student, 'college');
console.log(instance3.sayHi())
});```
## Extend decorator, Demo fo extends
see AOP extends (https://github.com/zhouhoujun/tsioc/blob/master/packages/aop/src/AopModule.ts)
You can extend yourself decorator via:## Documentation
Documentation is available on the
* [@tsdi/ioc document](https://github.com/zhouhoujun/tsioc/tree/master/packages/ioc).
* [@tsdi/aop document](https://github.com/zhouhoujun/tsioc/tree/master/packages/aop).
* [@tsdi/core document](https://github.com/zhouhoujun/tsioc/tree/master/packages/core).
* [@tsdi/boot document](https://github.com/zhouhoujun/tsioc/tree/master/packages/boot).
* [@tsdi/components document](https://github.com/zhouhoujun/tsioc/tree/master/packages/components).
* [@tsdi/activities document](https://github.com/zhouhoujun/tsioc/tree/master/packages/activities).
* [@tsdi/typeorm-adapter document](https://github.com/zhouhoujun/tsioc/tree/master/packages/typeorm-adapter).
* [@tsdi/unit document](https://github.com/zhouhoujun/tsioc/tree/master/packages/unit).
* [@tsdi/unit-console document](https://github.com/zhouhoujun/tsioc/tree/master/packages/unit-console).
* [@tsdi/cli document](https://github.com/zhouhoujun/tsioc/tree/master/packages/cli).## License
MIT © [Houjun](https://github.com/zhouhoujun/)