Skip to content

Custom DI container



An example how to create and use your own provider:

  1. Create folder app/providers/services/my_provider with 2 files index.js and Provider.js

  2. index.js should contain the implementation of the service itself:

    export default class MyProvider {
    constructor(redisConnection, userRepo) {
    this.redisConnection = redisConnection
    this.userRepo = userRepo
    }
    async updateAction(ws, fields) {
    const id = await this.redisConnection.client ...
    const updatedUser = await this.userRepo.update ...
    ...
    return updatedUser
    }
    }
  3. Provider.js should export an instance of RegisterProvider which contains instructions how to create an instance of index.js class with dependencies:

    import RegisterProvider from "@sama/common/RegisterProvider.js";
    import MyProvider from "./index.js";
    const name = "MyProvider";
    class MyProviderRegistration extends RegisterProvider {
    register(slc) {
    const redisConnection = slc.use("RedisClient");
    const userRepo = slc.use("UserRepository");
    return new MyProvider(redisConnection, userRepo);
    }
    }
    export default new MyProviderRegistration({
    name,
    implementationName: MyProvider.name,
    });
  4. Then, add export of Provider.js to app/providers/index.js

    import UserRepoProvider from "./repositories/user/Provider.js"
    ...
    ...
    import MyProviderRegistration from "./services/my_provider/Provider.js"
    const providers = [
    UserRepoProvider,
    ...
    ...
    MyProviderRegistration
    ]
    export default providers
  5. For any custom APIs providers - use /APIs/[API_NAME]/providers/index.js file:

  6. And now yiou can use MyProvider class where needed, e.g. in controller:

    import ServiceLocatorContainer from "@sama/common/ServiceLocatorContainer.js"
    class Controller {
    async edit(ws, data) {
    const myProvider = ServiceLocatorContainer.use("MyProvider")
    const updatedUser = await myProvider.updateAction(ws, data)
    ...
    }
    }
  7. Done.