لقد سمعت عن اسم الأدوية الجنيسة في .NET 2.0، لكن لم يتم استخدامه في التطوير الفعلي.
لقد قمت بتجربتها مؤخرًا أثناء تطوير برنامج موقع Blog Park.
سيناريوهات التطبيق:
اقرأ إعدادات البريد المقابلة في ملف التكوين من خلال إلغاء التسلسل.
مثال ملف التكوين:
<إعدادات تكوين المدونة>
<إعدادات البريد>
<MailSetting Name = "ApproveEmail" SmtpServer = "smtp.126.com" EmailFrom = "" اسم المستخدم = "" PassWord = ""></MailSetting>
<MailSetting Name = "ContactEmail" SmtpServer = "smtp.163.com" EmailFrom = "" اسم المستخدم = "" PassWord = ""></MailSetting>
</ إعدادات البريد>
</BlogConfigurationSettings>
وصف الوظيفة:
من خلال ملف التكوين، يتم الحصول على سمة MailSettings لمثيل BlogConfigurationSettings من خلال إلغاء التسلسل، ثم يتم الحصول على MailSetting المقابل وفقًا للكلمة الأساسية، على سبيل المثال: MailSetting المسمى ApproveEmail.
تعريف إعداد البريد:
إعداد البريد
[قابل للتسلسل]
إعداد بريد الفئة العامة
{
سلسلة خاصة _name؛
[XmlAttribute("الاسم")]
اسم السلسلة العامة
{
الحصول على { اسم العودة }
تعيين {_الاسم = القيمة}
}
سلسلة خاصة _smtpServer؛
[XmlAttribute("SmtpServer")]
سلسلة عامة SmtpServer
{
الحصول على { العودة _smtpServer }
تعيين { _smtpServer = القيمة }
}
سلسلة خاصة _mailFrom;
[XmlAttribute("MailFrom")]
سلسلة MailFrom العامة
{
الحصول على { إرجاع _mailFrom }
تعيين { _mailFrom = القيمة }
}
سلسلة خاصة _ اسم المستخدم؛
[XmlAttribute("اسم المستخدم")]
اسم مستخدم السلسلة العامة
{
الحصول على { عودة _اسم المستخدم }
تعيين { _ اسم المستخدم = القيمة }
}
سلسلة خاصة _password؛
[XmlAttribute("كلمة المرور")]
كلمة مرور السلسلة العامة
{
الحصول على { إرجاع _ كلمة المرور }
تعيين { _كلمة المرور = القيمة }
}
مفتاح السلسلة العامة
{
الحصول على { إرجاع هذا الاسم }
}
}
إذا لم نستخدم الأدوية العامة، فيمكننا تنفيذها من خلال المصفوفات أو فئات التجميع.
بالنسبة للمصفوفات، نحتاج إلى تعريف ذلك في BlogConfigurationSettings:
إعداد البريد الخاص [] __mailSettings؛
[XmlArray("إعدادات البريد")]
إعدادات البريد العامة [] إعدادات البريد
{
الحصول على {إرجاع هذا._mailSettings}؛
تعيين { this._mailSettings = القيمة }
}نحتاج أيضًا إلى كتابة طريقة لتعداد عناصر المصفوفة وإرجاع إعدادات البريد المقابلة بناءً على الكلمة الأساسية.
بالنسبة لفئات المجموعة، تحتاج إلى تحديد ذلك في BlogConfigurationSettings:
MailSettingCollection الخاص _mailSettings؛
[XmlArray("إعدادات البريد")]
إعدادات MailSettingColletion العامة
{
الحصول على {إرجاع هذا._mailSettings}؛
تعيين { this._mailSettings = القيمة }
}نحتاج إلى كتابة فئة MailSettingCollection وتنفيذ طريقة في MailSettingCollection للعثور على MailSetting المطابق بناءً على الكلمات الرئيسية.
بالنسبة للأدوية العامة، نحتاج فقط إلى تحديد ما يلي في BlogConfigurationSettings:
قائمة خاصة<MailSetting> _mailSettings;
[XmlArray("إعدادات البريد")]
القائمة العامة<MailSetting> MailSettings
{
الحصول على { إرجاع _mailSettings }
تعيين { _mailSettings = القيمة؛}
}
ثم يمكن للسطر التالي من التعليمات البرمجية فقط الحصول على MailSetting المطابق بناءً على الكلمة الأساسية:
BlogConfigurationSettings.MailSettings.Find(delegate(MailSetting mailSetting) { return mailSetting.Key == "ApproveEmail"; })
نوع المعلمة لطريقة البحث هو Predicate<T>، وتعريفها هو:
المسند المنطقي للمفوض العام<T>(T obj)
أي نوع المفوض الذي تكون معلماته عامة وقيمة إرجاعه منطقية.
وظيفة البحث هي تعداد العناصر في القائمة<T> واستدعاء المفوض مع كل عنصر كمعلمة للمفوض عاد.
يمكنك أيضًا كتابة التعليمات البرمجية في معلمة Find أعلاه كطريقة منفصلة، ثم استخدام اسم الطريقة كمعلمة Find.
BlogConfigurationSettings.MailSettings.Find(IsMe);
المنطق العام IsMe (إعداد البريد mailSetting)
{
return mailSetting.Key == "ApproveEmail";
}
ستشعر على الفور بعدم الارتياح تجاه هذا الرمز. لماذا لا تكتب طريقة لكل كلمة رئيسية، وتعتقد أنه يجب كتابتها على النحو التالي:
المنطق العام IsMe (MailSetting mailSetting، مفتاح السلسلة)
{
إرجاع mailSetting.Key == مفتاح؛
}
بالطبع من الجيد كتابتها بهذه الطريقة، لكن Find لا يوافق على ذلك، حيث يُسمح لمعلماتها بأن تكون طرقًا ذات معلمة واحدة فقط.
فكيف حل هذه المشكلة؟
الحل الذي فكرت فيه هو كتابة فئة MailSettingPredicate:
الفئة العامة MailSettingPredicate
{
مفتاح السلسلة الخاصة؛
مفتاح السلسلة العامة
{
الحصول على { مفتاح العودة }
تعيين { مفتاح = القيمة }
}
المنطق العام IsMe(MailSetting mailSetting)
{
إرجاع mailSetting.Key == this.key;
}
}
قبل الاتصال بـ IsMe، قم أولاً بتعيين قيمة MailSettingManager.Key، ويكون الرمز كما يلي:
MailSettingPredicate predicate= new MailSettingPredicate();
predicate.Key = "ApproveEmail";
Config.Settings.MailSettings.Find(predicate.IsMe);
predicate.Key = "ContactEmail";
Config.Settings.MailSettings.Find(predicate.IsMe);
لقد استخدمت للتو أدوية .NET 2.0 في التطوير الفعلي. وأنا أكتب هذه المقالة لتعميق فهمي. وآمل أيضًا أن أقدم بعض المراجع للأصدقاء الذين ليسوا على دراية بأدوية .NET 2.0. ومرحبًا بكم في الإشارة إلى أي عيوب.