Injector框架理解(四)

上一节我们学习了配置一个组件的依赖项的两种方式,以及配置一个属性组件;今天我们来学习didi框架的另外一些功能,我们先看看代码:

const {Injector} = require('didi');
function bar(baz, abc) {
    return {
      baz: baz,
      abc: abc
    };
}
bar.$inject = [ 'baz', 'abc' ]; 

const module1 = /** @type ModuleDeclaration */ ({
    baz: [ 'value', 'baz-value' ],
    abc: [ 'value', 'abc-value' ]
});

const injector = new Injector([ module1 ]);

const result = injector.invoke(bar);
console.log('result:',result);

输出如下:

从这里看出,调用invoke方法可以获取某个组件的返回值,比如这里bar组件返回的一个对象,并且得到组件的依赖项。

我们再来看看另一种使用方式:

const {Injector} = require('didi');
function bar1(a, b) {
    return {
      baz: a,
      abc: b
    };
}

const module1 = /** @type ModuleDeclaration */ ({
    baz: [ 'value', 'baz-value' ],
    abc: [ 'value', 'abc-value' ]
});

const injector1 = new Injector([ module1 ]);
const result1 = injector1.invoke(['baz','abc', bar1]);
console.log('result1:',result1);

输出如下:

从这里可以看出,invoke方法还可以调用一个数组式依赖的对象,这里的本质上就是配置一个组件的依赖项。

我们再看看invoke方法用默认的组件替换模块的组件:

const {Injector} = require('didi');
class FooType {
    constructor() {
      throw new Error('foo broken');
    }
}

const injector = new Injector([
    {
      foo: [ 'type', FooType ]
    }
]);

const annotatedFn = [ 'foo', 'bar', function(foo, bar) {
    console.log('foo local:',foo);
    console.log('bar local:',bar);
}];

injector.invoke(annotatedFn, null, { foo: 'FOO', bar: undefined });

我们看输出:

可以看出,invoke的第三个参数传入的组件作为依赖项传入到了annotatedFn组件中,因此,这是一个用外部组件替换模块组件的方法。

版权声明:著作权归作者所有。

thumb_up 0 | star_outline 0 | textsms 0