תרגום ל: שימוש בתבנית המפעל כדי לנהל ערוצי אי-ההה שונים במוצר SaaS
אתגר ההנעה ב- SaaS
מוצרי SaaS מודרניים מסתמכים על זמן, הודעות מותאמות אישית כדי לעסוק במשתמשים, בשמירת נהיגה, ולתקשר אירועים קריטיים במערכת.משתמשים מצפים לקבל התראות באמצעות הערוצים המועדפים שלהם - דואר אלקטרוני, SMS, לדחוף הודעות, הודעות בתוך האפליקציה, או אפילו webhooks לשירותים של צד שלישי.כפי שהמוצר מתפתח, מספר הערוצים גדל וניהול אותם באמצעות לוגיקה מותנית הופך לסיוט נקי, אדריכלות ניתנת להחלפה.
Directus, קוד פתוח ללא ראש CMS ופלטפורמת backend, מספק בסיס גמיש לבניית יישומים SaaS.מודל הנתונים שלה, מנוע Flows, ו sible s להפוך אותו לסביבה אידיאלית ליישום מערכת הודעה חזקה. על ידי יישום דפוס עיצוב קלאסי עיצוב עיצוב עיצוב עיצוב עיצוב עיצוב עיצוב - דפוס המפעל - אתה יכול לבודד יצירת ספציפית ערוץ, decouple את הקוד העסקי שלך מפרטי אספקה, ולהוסיף ערוצים חדשים ללא תשלום.
הבנת תבנית המפעל
דפוס המפעל הוא דפוס עיצוב בריא המספק ממשק ליצירת אובייקטים ברמה סופר, אך מאפשר תת-קבוצה לשנות את סוג האובייקטים אשר ייצרו.הוא מקדם הפיכה רופפת ומציית ל-FLT:0 Open/Closed PrincipleFLT:1: ישויות תוכנה צריכות להיות פתוחות לתוספת אך סגורות במקום שינוי יישום עם FLT:0 פתוח לאובייקט מיידי או ל- 1.
דפוס זה מאיר כאשר יש לך משפחה של אובייקטים קשורים ואת הסוג המדויק של מיידי נקבע בריצה על בסיס קלט דינמי - כגון העדפות הודעה של המשתמש או האירוע מופעל. בהקשר של הודעה, כל ערוץ הוא "מוצר" אחר, אך הם חולקים ממשק משותף (למשל, AFLT:2 Method).
ערוצים ב- SaaS
ערוצי הודעות משותפים כוללים:
- (FLT:0) EmailigmLT:1) - הודעות דוא"ל ושיווק באמצעות שירותים כגון SendGrid או Mailgun.
- (ב) ויקרא י"ד: ויקרא י"ד) - הודעות קצרות באמצעות Twilio או Vonage.
- (ב) [15] ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
- (ב) ,0) ,3 ,2 ,2 , ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
- (ב) HTTP POST מבקש נקודות קצה חיצוניות לשילובים.
- (ב) ,0) ,(הופנה מהדף (ב)
ללא דפוס, הקוד שלך עשוי להיראות כך:
function sendNotification(channel, message, recipient) {
if (channel === 'email') {
// Email logic here
} else if (channel === 'sms') {
// SMS logic here
} else if (channel === 'push') {
// Push logic here
} else {
throw new Error('Unknown channel');
}
}
גישה זו עובדת עבור כמה ערוצים, אבל כל ערוץ חדש מכריח אותך לשנות את תפקיד השולח שלך ולחשוף מחדש את כל ההיגיון הקיים.תבנית המפעל מבטלת את השבריריות הזו.
יישום תבנית המפעל עבור Notifications
להלן אנו עוברים יישום TypeScript שניתן להתאים ל- SaaS מבוסס Directus. TypeScript הוא טבעי עבור Directus כי הפלטפורמה עצמה בנויה עם זה ומספקת מערכת מסוג עשיר.
1.הגדירו את צומת הזיהוי
interface Notification {
send(message: string, recipient: string): Promise<void>
}
2. שיעורי הנקה
class EmailNotification implements Notification {
async send(message: string, recipient: string): Promise<void> {
// Use Directus’s internal mailer or an external SDK
console.log(`Sending email to ${recipient}: ${message}`);
}
}
class SMSNotification implements Notification {
async send(message: string, recipient: string): Promise<void> {
// Call Twilio API
console.log(`Sending SMS to ${recipient}: ${message}`);
}
}
class PushNotification implements Notification {
async send(message: string, recipient: string): Promise<void> {
// Use Firebase or OneSignal SDK
console.log(`Sending push to ${recipient}: ${message}`);
}
}
מפעל ההנעה
type ChannelType = 'email' | 'sms' | 'push';
class NotificationFactory {
static createNotification(channel: ChannelType): Notification {
switch (channel) {
case 'email':
return new EmailNotification();
case 'sms':
return new SMSNotification();
case 'push':
return new PushNotification();
default:
throw new Error(`Unknown notification channel: ${channel}`);
}
}
}
שימוש במפעל בבקשתך
async function notifyUser(event: string, userId: string, channel: ChannelType) {
const notification = NotificationFactory.createNotification(channel);
await notification.send(event, userId);
}
קוד הלקוח לעולם לא צריך לדעת את הסוג קונקרטי.זה תלוי רק בממשק (FLT:8 ).ההההפצה הזו גורמת ליחידה לבחון באופן ישיר - אתה יכול ללעג את אובייקט ההודעה מבלי לגעת במפעל או בשיעורים קונקרטיים.
שילוב של ה- Factory Pattern with Directus
Directus מציע מספר נקודות כניסה עבור הפעלת הודעות:
- (ב) ,0)FlowsveFLT:1 - אוטומציה חזותית שיכולה לקרוא פעולות מותאמות אישית או webhooks.
- (ב) ,0) ,(ה) ,(ה) ,(ב) ,(ה) ,(ה) ,(ה) , ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
- (ב) ,0) קווי קצה של קו הסיום של ה-Custom EndpointsFLT:1, Express מוזרקים אל שרת Directus.
- (ב) ,0WebhoosFLT:1 - יוצא מברקים.
בפרויקט Directus, תוכל להתקין את מפעל ההודעות שלך כשירות בתוך מודול מותאם אישית או הרחבה.לדוגמה, בתוך FLT:0FlowFLT:1 תוכל לקרוא לנקודת קצה פנימית של API שמנחה את הערוץ הנכון בהתבסס על העדפות מאוחסנים של המשתמש. לחלופין, באפשרותך לעטוף את המפעל ב-F:2hookalFalalalalalalalalph 3 לאחר סימן חדש של קובץ SMS, ו-Mail.
מכיוון שהמפעל חי במקום אחד, אתה יכול לעדכן את המיפוי שלו מבלי לגעת בכל פיסת או זרימה, ומכיוון ש-Directus Flows יכול להעביר נתונים שרירותיים של JSON, אתה יכול בקלות להאכיל את המפעל עם מזהה ערוצים ממסד הנתונים שלך.
היתרונות של גישת ה- Factory Pattern
סקלאה
הוספת ערוץ חדש פירושה כתיבת מחלקה חדשה שמילאה את ה-FLT:11 והוספת קו אחד להצהרת מתג המפעל.אין נדרשים שינויים בקוד הלקוחות.זה חשוב במיוחד במוצרים SaaS רב-גבוהים שבהם דיירים שונים עשויים לאפשר קבוצות שונות של ערוצים.
שמירה על
לוגיקה של העברת מידע מבודדת מלוגיקה עסקית.כל מחלקה קונקרטית יכולה להיות נתמכת באופן עצמאי, אם ספק ה-SMS משנה את ה- API שלו, אתה משנה רק 12:12 המפעל וכל הצרכנים נשארים ללא שינוי.
אחריות
ניתן לבדוק כל שיעור הודעות בבידוד, ותוכל ללעג לממשק ה-FLT:13 כאשר בוחנים פונקציות ברמה גבוהה יותר.המפעל עצמו יכול להיות מאומת עם בדיקה פשוטה הבודקת כי הוא מחזיר מקרים של הסוג הנכון לכל ערוץ.
גמישות
המפעל יכול להיות מורחב כדי לבנות אובייקטים מורכבים.לדוגמה, ייתכן שתרצה להעביר תצורה (מפתחי APII, מדיניות retry) בזמן הבריאה.You יכול לטעון את שיטת המפעל או להשתמש ב-FLT:0BuildercioFLT:1 דפוס בתוך המפעל כדי להרכיב אובייקטים מוגדרים לחלוטין.
חסרונות פוטנציאליים ושיקולים
בעוד שתבנית המפעל היא כלי רב עוצמה, זה לא כדור כסף:
- (בשיתוף פעולה:0) אם יש לך רק שני ערוצים ואין לך תוכניות להוסיף יותר, מצב פשוט עשוי להיות בסדר.
- (ב) לוגיקה של ענישה עדיין קיימת: FLTRE:1 המפעל עצמו משתמש בהצהרת מתג, אם יש לך עשרות ערוצים, לשקול את ה-FLT:2registry PatternsFLT 3: שבו ערוצים עצמם, או להשתמש בדפוסי תפוצה עצמית, או להשתמש בתבנית FLT:4strategy FigFLT:5 אשר מחליפה אלגוריתמים ולא אובייקטים יכולים להשלים את המפעל.
- (FLT:0) הזרקת הדחיפות: 1FLT אם שיעורי ההודעה שלך תלויים בשירותים חיצוניים (למשל, לקוח HTTP או לוגר), עליך להזריק את התלות האלה.המפעל חייב לקבל מיכל DI או לקבל את התלויים כפרמטרים - משהו לתכנן מוקדם.
בהרחבה ישירה, ניתן למנף את הזרקת התלות המובנת של הפלטפורמה (FLT:15 פונקציה ושירותים) כדי להעביר מקרים משותפים כגון הלוגר או גישה מסד הנתונים למפעל.
דוגמה אמיתית לעולם: Multi-Channel Notifications in a B2B SaaS
שקול כלי ניהול פרויקטים שנבנה על Directus. כאשר משימה מוקצה, המערכת חייבת להודיע:
- הסימון באמצעות דואר אלקטרוני (אם הם מעדיפים את זה)
- הסימון באמצעות In-app toast
- ערוץ הפרויקט על Slack
שימוש במפעל, הקוד תחת קונסולת 16 הופך:
import { NotificationFactory } from './services/NotificationFactory';
async function onTaskCreate(payload, { accountability }) {
const { assigneeId } = payload;
const userPreferences = await getUserNotificationPreferences(assigneeId);
for (const channel of userPreferences.channels) {
const notifier = NotificationFactory.createNotification(channel);
await notifier.send(`You have a new task!`, assigneeId);
}
}
כל מחלקה של הודעות מטפלות במשלוח לאדיומטי משלה.המפעל נשאר מקור האמת היחיד למיפוי ערוצים.
כדי לראות יישום מלא של מערכת כזו, מתייחס ל-FLT:0Directus הרשמי של תיעוד ההרחבה 1 על יצירת התאמות ושירותים מותאמים אישית.עבור הבנה עמוקה יותר של דפוס המפעל עצמו, ה-FLT:2Refactoring Guru דף על Factory MethodFLT 3: ייתכן גם להיות מעוניין כיצד פלטפורמות אחרות להתמודד עם תזמורות - LT5 לא להציג את המושגים דומים ב-EROL5.
מסקנה
תבנית המפעל מספקת דרך נקייה, שומרת על ניהול ערוצי הודעות מרובים במוצר SaaS.על ידי ניצול יצירת אובייקטים, אתה מפוצץ את לוגיקה הליבה שלך ממשלוח ספציפי, מה שהופך את זה קל להוסיף, להסיר או לשנות ערוצים ללא אפקטים משבשים על פני בסיס הקוד. כאשר בשילוב עם התאמות גמישות של Directus ותזרים, אתה מקבל ארכיטקטורת הודעה כי בקנה מידה עם צמיחת המוצר שלך.
בין אם אתה בונה מתווך דואר אלקטרוני פשוט או מנוע רב ערוצים מורכב, החל בדפוס המפעל מוקדם לשלם כאשר התכונה שלך מרחיבה.ההשקעה בכמות קטנה של מופשטת היום חוסכת ימים של שינוי מחר.