Custom DI container
An example how to create and use your own provider:
Step-by-step instructions
Section titled “Step-by-step instructions”-
Create folder
app/providers/services/my_provider
with 2 filesindex.js
andProvider.js
-
index.js
should contain the implementation of the service itself:export default class MyProvider {constructor(redisConnection, userRepo) {this.redisConnection = redisConnectionthis.userRepo = userRepo}async updateAction(ws, fields) {const id = await this.redisConnection.client ...const updatedUser = await this.userRepo.update ......return updatedUser}} -
Provider.js
should export an instance of RegisterProvider which contains instructions how to create an instance ofindex.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,}); -
Then, add export of
Provider.js
toapp/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 -
For any custom APIs providers - use
/APIs/[API_NAME]/providers/index.js
file: -
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)...}} -
Done.