Xây dựng một căn hộ không đầu ở Chỉ đạo với một mẫu nhà máy trừu tượng

Việc quản lý nội dung hiện đại đòi hỏi sự linh động, khả năng tăng cường và sự tách rời các mối quan tâm. Khi làm việc với Dirctus [FLT: 1] ) ) - 1 Bộ trưởng bộ máy không đầu [FLT] mà có thể tạo một dạng ATI trực giác trên cơ sở dữ liệu hệ thống mặc định mặc định] - thiết lập các gia đình (các thành phần liên quan, biến đổi dữ liệu, hoặc dạng kỹ thuật) mà không cần thiết nhất, là [FT: 2]. Tính năng này cho phép bạn tạo ra các gia đình có thể thay đổi nội dung, hoặc toàn bộ hệ thống cơ sở dữ liệu dựa trên cơ sở dữ liệu, hoặc toàn bộ cơ sở dữ liệu.

Hiểu được gương mẫu về sự phân biệt nguyên nhân trong một văn cảnh không đầu

Trong một hệ thống như thế, có thể điều khiển các khối hay chủ đề. Trong trường hợp này, mẫu được dịch tự nhiên để tạo ra các bộ sưu tập, cấu hình trường, các phản ứng của hệ thống ứng ứng ứng ứng ứng ứng ứng ứng ứng ứng ứng ứng ứng trước hoặc các thành phần hoạt động. Thay vì kết nối mã của bạn trực tiếp đến các bộ sưu tập trực tiếp hoặc cấu trúc mục cụ thể, bạn xác định các nhà máy trừu tượng tạo ra các mô- đun có thể trao đổi. Điều này trở nên mạnh mẽ khi bạn có nhiều “gia đình khác nhau như cổng, thiết lập đa phần, nhiều phần tử, hoặc thiết lập đa nhãn.

Áp dụng mẫu trong phần mở rộng bổ sung hay phần mở rộng Chỉ thị

Chỉ định cho phép phần mở rộng (ok, điểm kết thúc, bảng điều khiển, mô- đun). Mô- đun kiểu Máy tính trừu tượng khớp hoàn hảo trong phần mở rộng này. Bạn có thể xác định một nhà máy dựa trên cấu hình hay vai trò người dùng, tức khắc lập tức bộ điều khiển, biên dịch và cấu hình trường hợp hợp hợp hợp hợp hợp hợp. Nó khuyến khích sự kết nối lỏng lẻo và dễ dàng hơn trong các phiên bản hoặc việc bật lên.

Bước 1: Định nghĩa giao diện trừu tượng cho thành phần nội dung

Bắt đầu bằng cách tạo giao diện TypeSQUS hay JavaScript cho các đối tượng mà nhà máy bạn sẽ sản xuất. Đối với bổ sung điểm kết thúc chỉ dẫn, đây có thể là đối tượng trình bày dữ liệu:

// Interface for a content renderer used in an API response
interface ContentRenderer {
 render(item: Record<string, any>): Record<string, any>;
}

// Interface for a field formatter
interface FieldFormatter {
 format(value: any, field: string): any;
}

Bước 2: Lớp học cụ thể về các gia đình nội tâm

Phát triển các lớp cụ thể để thực hiện các giao diện cho các trường hợp khác nhau. Chẳng hạn, một “bản dịch bằng tiếng Anh so với bản dịch“ sản phẩm ” trong danh mục:

class BlogContentRenderer implements ContentRenderer {
 render(item: Record<string, any>): Record<string, any> {
 return {
 title: item.title,
 excerpt: item.excerpt,
 date: item.date_created,
 body: this.sanitizeHtml(item.body)
 };
 }
 private sanitizeHtml(html: string): string {
 return html.replace(/<script[^>]*>.*?<\/script>/gi, '');
 }
}

class ProductCatalogRenderer implements ContentRenderer {
 render(item: Record<string, any>): Record<string, any> {
 return {
 name: item.title,
 price: item.price,
 image: item.image,
 inStock: item.quantity > 0
 };
 }
}

Tạo ra nhà máy trừu tượng trong phần mở rộng trực tiếp

Giao diện nhà máy tuyên bố phương pháp tạo ra mỗi loại thành phần nội dung (người ký hiệu, định dạng, người ký hiệu, v. v.). Các nhà máy riêng sản xuất gia đình của những đối tượng này.

Ví dụ giao diện nhà máy

interface ContentModuleFactory {
 createRenderer(): ContentRenderer;
 createFormatter(): FieldFormatter;
 createValidator(): ItemValidator;
}

Tính năng tăng dần cho Môđun blog

class BlogModuleFactory implements ContentModuleFactory {
 createRenderer(): ContentRenderer {
 return new BlogContentRenderer();
 }
 createFormatter(): FieldFormatter {
 return new BlogFieldFormatter(); // formats dates, slugs, etc.
 }
 createValidator(): ItemValidator {
 return new BlogItemValidator(); // ensures required fields for posts
 }
}

Hợp nhất Hệ số thành điểm kết thúc trực tiếp

Với nhà máy đã vào vị trí, bạn có thể xây dựng một điểm kết thúc riêng của Directus sử dụng một gia đình thích hợp dựa trên một tham số truy vấn hoặc biến môi trường:

export default (router, { services, database }) => {
 const { ItemsService } = services;

 router.get('/content/:module', async (req, res) => {
 const module = req.params.module;
 let factory: ContentModuleFactory;

 switch (module) {
 case 'blog':
 factory = new BlogModuleFactory();
 break;
 case 'products':
 factory = new ProductModuleFactory();
 break;
 default:
 factory = new DefaultModuleFactory();
 }

 const renderer = factory.createRenderer();
 const validator = factory.createValidator();
 const itemsService = new ItemsService(module, { database });
 const items = await itemsService.readByQuery({ limit: 20 });

 // Validate and render each item
 const result = items.map(item => renderer.render(validator.process(item)));
 res.json({ data: result });
 });
};

Dùng cấp cao: Gia đình nội dung đa sắc tộc

Trực tiếp vượt trội ở nhiều mục tiêu với nhiều giản đồ hay bộ lọc truy cập. Dùng mẫu tỉ mỉ, bạn có thể tải các cấu hình nhà máy khác nhau dựa trên ID thuê. Mỗi người thuê có thể có một tập hợp các lệnh ghi đè, tạo ra logic, hoặc thậm chí các cấu trúc bộ sưu tập chỉ điểm khác nhau. Nhà máy này bao gồm tất cả các biến thể này trong khi giữ mã điểm cuối của bạn sạch và có thể kiểm tra.

Lợi ích của gương mẫu về sự phân biệt đối xử trong lời chỉ dẫn

  • Khả năng đọc:) chuyển đổi giữa các họ nội dung (blog, catalog, board) mà không cần viết lại logic lõi.
  • Khả năng giữ gìn: mỗi gia đình bị cô lập; thay đổi thành một không ảnh hưởng đến người khác.
  • Khả năng tính toán:) Thêm một gia đình nội dung mới có nghĩa là thực hiện một nhà máy bê tông mới và lớp học của nó - không thay đổi cho các nhà máy hoặc người tiêu dùng hiện có.
  • Khả năng: ) Các nhà máy và sản phẩm của chúng có thể được thử nghiệm độc lập, cải thiện chất lượng mã.
  • Sự tách rời khỏi nơi ở: mẫu áp dụng nguyên tắc trách nhiệm đơn, làm cho chỉ thị của bạn mở rộng dễ hiểu hơn. ).

Những lời suy xét thực tế cho các nhà phát triển chỉ đạo

Khi dự án Directus của bạn phát triển, hãy bắt đầu với một nhà máy đơn giản cho một hoặc hai gia đình nội dung, rồi mở rộng theo nhu cầu. Hãy giữ giao diện tối thiểu - chỉ công bố những gì người tiêu dùng thực sự sử dụng. Đối với dự án xếp loại, đòn bẩy tính năng để áp dụng sự an toàn cho các gia đình. Nếu bạn đang xây dựng bảng điều khiển trực tiếp cho các gia đình, hãy xem xét cách sử dụng Hệ thống Tính năng lượng ảo để tạo ra cấu hình trường khác nhau hoặc ô điều khiển dựa trên quyền người dùng.

Ví dụ: Hệ số cho Ô điều khiển bảng Quản trị

Trong bảng điều khiển chỉ thị tự chọn, bạn có thể có ô điều khiển tóm tắt dữ liệu từ bộ sưu tập khác nhau. Nhà máy quyết định thành phần nào của ô điều khiển sẽ chạy ngay:

interface DashboardWidget {
 type: string;
 props: Record<string, any>;
 render(container: HTMLElement): void;
}

class UsersWidget implements DashboardWidget { ... }
class OrdersWidget implements DashboardWidget { ... }
class Factory {
 createWidget(type: string): DashboardWidget {
 if (type === 'users') return new UsersWidget();
 if (type === 'orders') return new OrdersWidget();
 throw new Error('Unknown widget type');
 }
}

Khi không dùng mẫu này

Hãy tránh những gia đình đơn giản, một gia đình có nội dung hay khi bạn cần thay đổi bản đồ, hoặc khi bạn cần thay đổi bản đồ, việc mở rộng một phần nhỏ của hệ thống nhà máy có thể làm tăng sự phức tạp không cần thiết. Hãy dùng nó khi bạn dự đoán nhiều gia đình, những gia đình thường xuyên bổ sung, hoặc khi bạn cần trao đổi gia đình vào lúc chạy, dựa trên cấu hình.

Để có một sự lặn sâu hơn vào kiến trúc không đầu và kiểu thiết kế trong Directus, hãy kiểm tra hướng dẫn không đầu ) ) Ví dụ thực hiện [FLT:] (BLT:] (hay không có khả năng để Node.js).

Kết luận

Việc kết hợp các mẫu hình tỉ mỉ vào tiến trình phát triển của đạo luật chỉ đạo sẽ dẫn đến một hệ thống máy tính không đầu có thể thay đổi, có thể được, khuyến khích cấu trúc mã sạch, chuẩn bị hệ thống cho sự mở rộng trong tương lai, và sự linh hoạt của Directus mà không cần phải hy sinh.