npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

injector-ioc

v1.1.10

Published

injector-ioc ioc,object manager,service,factory,value,provider

Downloads

112

Readme

Injector 依赖注入会帮助我们创建Service、Factory、Provider,自动创建依赖并注入

起步

    <script src="dist/injector.js"></script>

初始化Injector

    var injector = new HERE.Injector();

定义变量

定义方式

    injector.value('configInfo',{
        info:'configInfo'
    });
    var configInfo = injector.getValue('configInfo');

定义Service:

    function serviceA(){
        this.serviceText = 'serviceA hello world' + Math.random();
        this.getText = function(){
            return this.getText();
        }
    }

定义方式:

1.通过类型获取Service

    injector.service(serviceA);
    var sA = injector.getService(serviceA);
    sA.getText(); // 'serviceA hello world..'

2.通过名称获取Service

    injector.service('serviceA',serviceA);
    var sA = injector.getService(serviceA) 或者 injector.getService('serviceA')
    sA.getText(); // 'serviceA hello world..'

3.Service是单例的

   var sB =  injector.getService(serviceA);
   sB === sA; //true
   
   //获取不同的实例
   var sC = injector.getFactory(serviceA) 或 injector.getFactory('serviceA');
   sC === sB // false

4.Service的名称

    //定义Service的时候不指定Service名称,injector会自动生成默认的Service名称
     injector.service(serviceA);
     Injector.identify(serviceA); //获取Service名称
     Injector.identify(serviceA,'serviceA_name'); //自定义Service的名称
     //获取Service
     var sA = injector.getService('serviceA_name'); //通过名称获取
     sA = injector.getService(serviceA); //通过类型获取
     
    //注:在声明Service的时候定义名称,这个名称拥有最高优先级,会覆盖之前定义的Service名称
    injector.service('serviceA_name_new',serviceA);
    sA = injector.getService('serviceA_name_new');

5.Service的依赖注入

    function serviceB(serviceA){
        this.getText = function(){
            return serviceA.getText();
        }
    }
    injector.service('serviceB',serviceB);
    var sB = injector.getService('serviceB');
    sB.getText(); // 'serviceA hello world ..'
    //注:这种方式仅在代码为经过压缩的时候生效,且serviceA的名称是serviceA时可用
    
    //定义依赖
    serviceB.$injector = [serviceA]; //通过类型注入
    serviceB.$injector = ['serviceA'];//通过名称注入
    
    //声明时定义依赖
    injector.service('serviceB',['serviceA',serviceB]); //依赖通过名称注入
    injector.service('serviceB',[serviceA,serviceB]); //依赖通过类型注入
    
    注:Service依赖可以时已经声明的Value、Service、Factory,如依赖的是Service,则会返回单例的实例

定义Factory

    function factoryA(){
        return {
            text:'factoryA helloworld' + Math.random(),
            getText:function(){
                return this.text;
            }
        };
    }

定义方式

1.通过类型

    injector.factory(factoryA);
    var fA = injector.getFactory(factory);
    fA.getText(); // 'factoryA helloworld..'
    
    var fA_ = injector.getFactory(factory);
    fA === fA_; // false
    
    var fA__ = injector.getService(factory);
    fA__.getText(); // 'factoryA helloworld..' 与getFactory 等效

2.通过名称

    injector.factory('factoryA',factoryA);
    var fA = injector.getFactory('factoryA') 或 injector.getFactory(factoryA);
    fA.getText(); // 'factoryA helloworld..'

3.Factory名称

//定义Factory的时候不指定Factory名称,injector会自动生成默认的Service名称
     injector.factory(factoryA);
     Injector.identify(factoryA); //获取Factory名称
     Injector.identify(factoryA,'factoryA_name'); //自定义Factory的名称
     //获取Service
     var fA = injector.getFactory('factoryA_name'); //通过名称获取
     fA = injector.getFactory(factoryA); //通过类型获取
     
    //注:在声明Factory的时候定义名称,这个名称拥有最高优先级,会覆盖之前定义的Factory名称
    injector.factory('factoryA_name_new',factoryA);
    fA = injector.getFactory('factoryA_name_new');

4.factory名称

    function factoryB(factoryA){
        this.getText = function(){
            return factoryA.getText();
        }
    }
    injector.factory('factoryB',factoryB);
    var fB = injector.getFactory('factoryB');
    fB.getText(); // 'factoryA helloworld..'
    //注:这种方式仅在代码为经过压缩的时候生效,且factoryA的名称是factoryA时可用
    
    //定义依赖
    factoryB.$injector = [factoryA]; //通过类型注入
    factoryB.$injector = ['factoryA'];//通过名称注入
    
    //声明时定义依赖
    injector.factory('factoryB',['factoryA',factoryB]); //依赖通过名称注入
    injector.factory('factoryB',[factoryA,factoryB]); //依赖通过类型注入
    
    注:Service依赖可以时已经声明的Value、Service、Factory,如依赖的是Service,则会返回新创建的实例

调用函数

    injector.invoke(function(){
        console.log('invoke function');
    });
    injector.invoke(['serviceA',function(sA){
        sA.getText();
    }]);
    injector.invoke([serviceA,function(sA){
        sA.getText();
    }]);

定义Provider

1.定义方式

    function providerA(){
        this.testText = 'providerA text';
        this.$get = function(){
            return this.testText;
        }
    }
    injector.provider(providerA);
    var pA = injector.getProvider(providerA);
    pA.$get(); // 'providerA text';
    var pA_ = injector.getProvider(providerA);
    pA === pA_; //true Provider是单例的
    
    注:Provider的定义与Service、Factory类似,区别在于Provider只能依赖已经声明的Provider,且必须包含一个$get方法签名

Injector的继承

1.继承方式

    var injectorB = new HERE.Injector(injector);
    var sA = injectorB.getService('serviceA'); //获取injector中定义的Service
    injectorB.service('serviceA',function(){
        this.getText = function(){
            return 'serviceB from injectorB';
        };
    });
    sA = injectorB.getService('serviceA');
    sA.getText(); // 'serviceB from injectorB'

2.多继承

    var injectorC = new HERE.Injector();
    var injectorD = new HERE.Injector(injectorA,injectorC); //或 new HERE.Injector([injectorA,injectorC]);
    injectorD.getService('serviceA');
    //注:获取Service、Factory、Provider、Value顺序:先从injectorD中获取,获取不到则从injectorA、injectorC中获取

配置

    Injector.config({
        debugMode:true,
        injectorIdentifyKey:'$injectorName',
        injectorDepIdentifyKey:'$injector'
    });
    //注:配置需要在初始化Injector之前进行,初始化后不能进行配置,一般不需要配置,当$injectorName、$injector发生命名冲突时才需要配置