Разглеждах проекта с отворен код Novu. Той следва DDD модел за развитие. Там видях общия DDD модел с внедряване на команди и случаи на използване върху услугата NestJS.
Командването в разработката, управлявана от домейн, е основно като DTO (прост клас в термина за непрофесионалисти). Видях, че всяка команда следва модела ClassName.create() за създаване на нов клас, вместо да използва конструктори.
Методът за статично създаване в командата обработи всички проверки. Така че беше логично да направя конструктора незаконен за използване, което ме накара да внедря нещо подобно в машинопис.
С прости думи, кодът по-долу трябва да направи конструктора незаконен за използване в нивото на типа. Принуждаване на потребителите да използват вместо това метода ClassName.create().
Можем също да го направим асинхронен.
// Happy Nepali New Year 2080 guys 🇳🇵 // this is me mocking a database repository level const carsDb = { exists:async (id:string)=>Promise.resolve(false), getUser: async(id:string)=>Promise.resolve({ "name":"Nirjal Paudel" }) } /* Lets say you have a use case, where you want to instaniate an object if and only if your some asynchronous API call works */ class Car{ id: string; // I am lazy to make types here hehe user: any; // This will make constuctor illegal to use in type level private constructor(id:string){ this.id = id } static async createCar(id:string){ // some asyncronous business logic here // lets say you create check an API here to find out // if car by the id exists or not already, const carExists = await carsDb.exists(id); if (!carExists) throw new Error("Cannot create Car"); const carObj = new Car(id); // some wrapping around car -> lets say carObj.user = await carsDb.getUser(id); return carObj; } } // should give type error const car1 = new Car("car1-id"); const car2 = new Car() // works as an asynchronous constructor const car2 = await Car.createCar("car2-id"); // making it modular to support top level await export {}
Novu: https://github.com/novuhq/novu
#разработка с отворен код