Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up

Inversion of Control container & Dependency Injection for Javascript and Node.js apps powered by Typescript.

License

NotificationsYou must be signed in to change notification settings

typesoft/container-ioc

Repository files navigation

alt text

container-ioc

is aDependency Injection /Inversion of Control (IoC) container package for Javascript and Node.js applications powered by Typescript . It manages the dependencies between classes, so that applications stay easy to change and maintain as they grow.

npm versionBuild StatusnpmGitter chatlicense

Features:

Examples:

Installation:

npm install --save container-ioc

Basics:

Code examples below are written in Typescript. Checkexamples/javascript for examples written in Javascript.

Step 1. Define your interfaces and types.

Possible values for types:Symbol,string,Object.

interfaceIApplication{run():void;}interfaceIService{serve():void;}constTApplication=Symbol('IApplication');constTService=Symbol('IService');

Step 2. Declare dependencies with decoratorsInjectable andInject.

import{Injectable,Inject}from'container-ioc';@Injectable()exportclassApplicationimplementsIApplication{constructor(@Inject(TService)privateservice:IService){}run():void{this.service.serve();}}@Injectable()exportclassServiceimplementsIService{serve():void{// serves}}

Step 3. Create a container and register types in there.

import{Container}from'container-ioc';letcontainer=newContainer();container.register([{token:TApplication,useClass:Application},{token:TService,useClass:Service}]);

Step 4. Resolve value from the container.

letapp=container.resolve(TApplication);app.run();

Step 2 for Javascript.

Since Javascript does not support parameter decorators, use alternative API for declaring dependencies. In this case we don't useInject decorator. Seeexamples/javascript for more.

@Injectable([TService])classService{constructor(service){this.service=service;}}

Life Time control

By default, containers resolve singletons when usinguseClass anduseFactory.Default life time for all items in a container can be set by passing an option object to it's contructor withdefailtLifeTime attribute. Possible values:LifeTime.PerRequest (resolves instances) andLifeTime.Persistent (resolves singletons);

import{LifeTime}from'container-ioc';constcontainer=newContainer({defaultLifeTime:LifeTime.PerRequest});

You can also specify life time individually for each item in a container by specifyinglifeTime attribute.

container.register([{token:TService,useClass:Service,lifeTime:LifeTime.PerRequest}]);
container.register([{token:TService,useFactory:()=>{return{serve():void{}}},lifeTime:LifeTime.Persistent}]);

Hierarchical containers

If a container can't find a value within itself, it will look it up in ascendant containers. There a 3 ways to set a parent for a container.

1. Container.createChild() method.
constparentContainer=newContainer();constchildContainer=parentContainer.createChild();
2. Container.setParent() method.
constparent=newContainer();constchild=newContainer();child.setParent(parent);
3. Via Container's constructor with options.
constparent=newContainer();constchild=newContainer({parent:parent});

Using Factories

/* Without injections */container.register([{token:'TokenForFactory',useFactory:()=>{return'any-value';}}]);/* With injections */container.register([{token:'EnvProvider',useClass:EnvProvider},{token:'TokenForFactory',useFactory:(envProvider)=>{// do somethingreturn'something';},inject:['EnvProvider']}]);

Using Values

container.register([{token:'IConfig',useValue:{}}]);

Shortcut for Classes

container.register([App]);

Is the same as:

container.register([{token:App,useClass:App}]);

Contribution

Become a contributor to this project. Feel free to submit anissue or a pull request.

seeCONTRIBUTION.md for more information.

Please see also ourCode of Conduct.


[8]ページ先頭

©2009-2025 Movatter.jp