@aantonov/dep-injector 中文文档教程

发布于 7年前 浏览 22 项目主页 更新于 3年前

Installation

npm install @aantonov/dep-injector

Usage

const app = require('express')();

const Factory = require('dep-injector');

const factory = new Factory(app);

const options = {
    //Определяем путь к установленным npm пакетам
    packagesPath: `${__dirname}/node_modules/`,

    //Указываем типы классов которые будут использоваться в приложении
    types: {
        managers: {
            //Указываем путь к конфигу инстанцирования классов. Конфиг инстанцирования подтягивается из app/managers/index.js
            path: `${__dirname}/app/managers`
        },

        services: {
            path: `${__dirname}/app/services`
        },

        controllers: {
            path: `${__dirname}/app/controllers`,

            //Если определена переменная config, то конфиги инстанцирования подтягиваютс из неё, а app/controllers/index.js игнорируется
            blueprints: [{
                //Имя модуля. Будет инстанцирован как testController
                name: 'test-controller',

                //См. ниже
                deployType: 'constructor',
                injectType: 'body',

                packages: [{
                    name: 'assert',

                    //Указываем, если модуль нативный
                    native: true
                }, {
                    name: 'then-redis',

                    //Указываем, если необходимо изменить имя инстанса. Иначе инстанцируется как thenRedis
                    instanceName: 'redis',

                    //Указываем, если после экспорта модуля необходимо вызвать функцию какую то из его функций
                    callFunction: {
                        name: 'createClient',
                        arguments: []
                    }
                }],

                //Определяем зависимости
                dependencies: {

                    services: [{
                        name: 'test-service',

                        //Если у зависимости определено поле `mock`, то этот объект будет заменять реальную зависимость
                        mock: {
                            getSomeNumber: function () {return 10}
                        }
                    }]
                }

            }]
        }
    },

    //Привязываем роуты к функциям контроллера
    routes: [{
        //Тип запроса
        method: 'post',

        //URL запроса
        url: '/some',

        //Метод контроллера который будет привязан к роуту
        func: 'controllers.test-controller.someFunction'
    }]
}

//Инстанцируем классы и зависимости
factory.create(options)

Controller example

Если deployType: '构造函数' && injectType: 'object'

class TestController {
    constructor(options) {
        this._assert = options.assert;
        this._testService = options.testService;
    }

    someFunction(req, res) {
        this._assert.equal(this._testService.getSomeValue(), 10); //ok

        res.send(200);
    }
}

Если deployType: '构造函数' && injectType: 'body'

```ecmascript 6 类测试控制器 { _断言:TAsert; _testService:测试服务;

someFunction(req, res) {
    this._assert.equal(this._testService.getSomeValue(), 10); //ok

    res.send(200);
}

}

### Mocks

ecmascript 6 const Factory = require('./build/factory'); 常量工厂=新工厂();

常量配置 = { 类型:{ 控制器: { 蓝图:[{ 名称:'测试控制器', // 部署类型 & injectType игнорируются。 Зависимости ижектятся в тело мока 嘲笑: { 符号:异步函数 (req, res) { const response = await this.testService.get();

                    res.send(response);
                }
            },

            dependencies: [{
                name: 'test-service',
                type: 'service'
            }]
        }]
    },

    service: {
        blueprints: [{
            name: 'test-service',
            deployType: 'constructor',
            injectType: 'object',

            //Инстанцирует класс исходя из конструктора
            $constructor: class {
                constructor({redis}) {
                    this.redis = redis;
                }

                async get() {
                    return this.redis.get('key');
                }
            },

            packages: [{
                name: 'redis',
                mock: {
                    get: function () {
                        return Promise.resolve('Hello World!')
                    }
                }
            }]
        }]
    }
}

};

常量实例 = factory.create(config);

const res = {发送:函数(值){ 控制台日志(值); // 打印 'Hello World!' }};

/**

  • {string} Name name of component
  • {string} Type type of component */ instances.get('test-controller', 'controller').sign({}, res); ```

Installation

npm install @aantonov/dep-injector

Usage

const app = require('express')();

const Factory = require('dep-injector');

const factory = new Factory(app);

const options = {
    //Определяем путь к установленным npm пакетам
    packagesPath: `${__dirname}/node_modules/`,

    //Указываем типы классов которые будут использоваться в приложении
    types: {
        managers: {
            //Указываем путь к конфигу инстанцирования классов. Конфиг инстанцирования подтягивается из app/managers/index.js
            path: `${__dirname}/app/managers`
        },

        services: {
            path: `${__dirname}/app/services`
        },

        controllers: {
            path: `${__dirname}/app/controllers`,

            //Если определена переменная config, то конфиги инстанцирования подтягиваютс из неё, а app/controllers/index.js игнорируется
            blueprints: [{
                //Имя модуля. Будет инстанцирован как testController
                name: 'test-controller',

                //См. ниже
                deployType: 'constructor',
                injectType: 'body',

                packages: [{
                    name: 'assert',

                    //Указываем, если модуль нативный
                    native: true
                }, {
                    name: 'then-redis',

                    //Указываем, если необходимо изменить имя инстанса. Иначе инстанцируется как thenRedis
                    instanceName: 'redis',

                    //Указываем, если после экспорта модуля необходимо вызвать функцию какую то из его функций
                    callFunction: {
                        name: 'createClient',
                        arguments: []
                    }
                }],

                //Определяем зависимости
                dependencies: {

                    services: [{
                        name: 'test-service',

                        //Если у зависимости определено поле `mock`, то этот объект будет заменять реальную зависимость
                        mock: {
                            getSomeNumber: function () {return 10}
                        }
                    }]
                }

            }]
        }
    },

    //Привязываем роуты к функциям контроллера
    routes: [{
        //Тип запроса
        method: 'post',

        //URL запроса
        url: '/some',

        //Метод контроллера который будет привязан к роуту
        func: 'controllers.test-controller.someFunction'
    }]
}

//Инстанцируем классы и зависимости
factory.create(options)

Controller example

Если deployType: 'constructor' && injectType: 'object'

class TestController {
    constructor(options) {
        this._assert = options.assert;
        this._testService = options.testService;
    }

    someFunction(req, res) {
        this._assert.equal(this._testService.getSomeValue(), 10); //ok

        res.send(200);
    }
}

Если deployType: 'constructor' && injectType: 'body'

```ecmascript 6 class TestController { _assert: TAssert; _testService: TestService;

someFunction(req, res) {
    this._assert.equal(this._testService.getSomeValue(), 10); //ok

    res.send(200);
}

}

### Mocks

ecmascript 6 const Factory = require('./build/factory'); const factory = new Factory();

const config = { types: { controller: { blueprints: [{ name: 'test-controller', // deployType & injectType игнорируются. Зависимости ижектятся в тело мока mock: { sign: async function (req, res) { const response = await this.testService.get();

                    res.send(response);
                }
            },

            dependencies: [{
                name: 'test-service',
                type: 'service'
            }]
        }]
    },

    service: {
        blueprints: [{
            name: 'test-service',
            deployType: 'constructor',
            injectType: 'object',

            //Инстанцирует класс исходя из конструктора
            $constructor: class {
                constructor({redis}) {
                    this.redis = redis;
                }

                async get() {
                    return this.redis.get('key');
                }
            },

            packages: [{
                name: 'redis',
                mock: {
                    get: function () {
                        return Promise.resolve('Hello World!')
                    }
                }
            }]
        }]
    }
}

};

const instances = factory.create(config);

const res = {send: function (value) { console.log(value); // Print 'Hello World!' }};

/**

  • {string} Name name of component
  • {string} Type type of component */ instances.get('test-controller', 'controller').sign({}, res); ```
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文