// factory, register 둘 다 단순 등록 기능이다. // factory 메소드의 경우 의존성 주입이 필요한 객체인 경우 사용한다. diContainer.factory = (name, factory) => { factories[name] = factory; };
// register 메소드의 경우 의존성 주입이 필요 없는 객체(상수 등)를 등록할 때 사용한다. diContainer.register = (name, dep) => { dependencies[name] = dep; };
/* 1. get은 dependencies에 없는 경우 factory로 간주하고 가져옴 2. 만약 가져오려 했던 객체가 존재하면 해당 객체로 inject를 호출함 (inject를 통해 재귀적으로 의존성을 resolve.) 3. (2)의 결과를 dependencies에 저장 4. 만약 그래도 dependencies에 없는 경우 모듈을 찾을 수 없는 것. */ diContainer.get = (name) => { if (!dependencies[name]) { const factory = factories[name]; dependencies[name] = factory && diContainer.inject(factory); if (!dependencies[name]) { thrownewError("Cannot find module: " + name); } } return dependencies[name]; };
// register는 추가적으로 의존성 주입이 필요 없는 객체를 등록한다. (상수 등) diContainer.register("dbName", "example-db"); diContainer.register("tokenSecret", "SHHH!");
// factory는 의존성 주입이 필요한 객체를 등록한다. diContainer.factory("db", require("./lib/db")); // Service 객체 등록 (의존성 주입 필요한 상태) diContainer.factory("authService", require("./lib/authService")); // Controller 객체 등록 (의존성 주입 필요한 상태) diContainer.factory("authController", require("./lib/authController"));
// get은 의존성을 반환한다. (재귀적으로 의존성 주입이 된 채로 반환된다.) const authController = diContainer.get("authController");
// Express에 Controller 등록 app.post("/login", authController.login); app.get("/checkToken", authController.checkToken);