"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيف يمكنك تخزين سير العمل مع أنواع العقد المتنوعة في MongoDB باستخدام Mgo (Go)؟

كيف يمكنك تخزين سير العمل مع أنواع العقد المتنوعة في MongoDB باستخدام Mgo (Go)؟

تم النشر بتاريخ 2024-11-09
تصفح:400

How Can You Store Workflows with Diverse Node Types in MongoDB using Mgo (Go)?

الواجهة كنموذج في Mgo (Go): حل خطأ قابلية التعيين

عند التعامل مع سير العمل الذي يشتمل على عقد من أنواع مختلفة، قد يكون الأمر كذلك من المغري الاستفادة من واجهات Golang لتغليف سلوكياتهم المتنوعة. ومع ذلك، فإن تخزين مسارات العمل هذه في MongoDB يشكل تحديًا فريدًا.

مشكلة قابلية التعيين

ينبع الخطأ الذي تمت مواجهته أثناء عملية البحث من عدم التوافق بين المستند الذي تم فك تشفيره والملف واجهة العقدة. يفتقر Mgo إلى معلومات النوع اللازمة لتحديد النوع المحدد لكل عقدة مدمجة. يؤدي هذا إلى عدم تطابق المهمة.

النهج البديل: التضمين باستخدام معلومات النوع

للتغلب على هذه العقبة، فكر في تغليف معلومات النوع داخل العقد المضمنة. حدد بنية جديدة، NodeWithType، والتي تتكون من واجهة Node وحقل النوع الذي يمثل النوع المحدد.

type NodeWithType struct {
   Node Node `bson:"-"`
   Type string
}

إلغاء تنظيم BSON المخصص

لسد الفجوة بين المستند الذي تم فك ترميزه وبنية Go، قم بتنفيذ وظيفة SetBSON لـ NodeWithType. ستقوم هذه الوظيفة بفك تشفير حقل النوع، وإنشاء مثيل من النوع المقابل، وتفويض عملية إلغاء التنظيم إليه.

func (nt *NodeWithType) SetBSON(r bson.Raw) error {
   // Decode Type field
   var typeName string
   err := bson.Unmarshal(r["Type"], &typeName)
   if err != nil {
      return err
   }

   // Create an instance of the correct type based on Type field
   var node Node
   switch typeName {
   case "EmailNode":
      node = &EmailNode{}
   case "TwitterNode":
      node = &TwitterNode{}
   }

   // Unmarshal the remaining fields into the created instance
   if err = node.SetBSON(r[typeName]); err != nil {
      return err
   }

   // Assign the created instance to the Node field
   nt.Node = node

   return nil
}

في بنية سير العمل، استبدل شريحة العقدة بشريحة NodeWithType.

type Workflow struct {
   CreatedAt time.Time
   StartedAt time.Time
   CreatedBy string
   Nodes []NodeWithType
}

بفضل هذا الأسلوب، يمكن لـ Mgo الآن العثور بنجاح على سير العمل وإلغاء تنظيمه باستخدام العقد المضمنة من أنواع مختلفة.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3