الواجهة كنموذج في 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