به شخصه، فکر میکنم هر چیزی که هر توسعه دهنده ای با آن سر و کله می زند مدیریت کلی شرط با if, else if, case و در نهایت اجرا کردن یک تکه کد میباشد. به نظر میاد که به یک Rule Engine نیاز داریم.
در این مقاله، قصد دارم کتابخانه جدیدم را که برای افزودن قوانین و اجرا تکه کد در صورتی که تمامی شرایط مقدار مثبتی را بازگردانند مفید باشد را معرفی نمایم.
من به یک شرط ساز ساده نیاز داشتم پس تصمیم گرفتم بر روی کتابخانه خودم کار کنم. RuleEngineCore یک کتابخانه است که با #C و بر پایه net Core. نوشته شده است.
در این کتابخانه، شما می توانید مقادیری را بعنوان ورودی برای اجرای قوانین آماده سازی کنید. قوانین از این مقادیر در شروط که در ادامه توضیح خواهم داد استفاده کرده و در صورت امکان توابع اصلی بدنه کد را به ترتیبی که مشخص شده اجرا خواهد کرد و در صورتی که قانونی وابسته به این قانون باشد و از قبل معرفی کرده باشید را مورد بررسی قرار میدهد.
با استفاده از این کتابخانه، شما میتوانید با هر مدل نامگذاری برای متد و شروط که میخواهید را انجام دهید. زیرا شما تنها نیاز دارید از نشانه گذاری ها استفاده کنید.
ما سه نوع نشانه گذاری داریم:
نشانه Rule فقط برای کلاسها کاربرد دارد و 3 ویژگی مانند نام، توضیحات، نوع کلاس قانون دیگر بعنوان قانون بعدی را میگیرد. که البته تمامی این موارد اختیاری هستند.
نکته: قانون بعدی باید از نشانه Rule استفاده کند در غیر اینصورت شروط و متد فراخوانی نخواهند شد.
نمونه کد:
[Rule(NextRule = typeof(AccountRule))] public class IdentificationRule { // Class Body }[Rule] public class AccountRule { // Class Body }
نشانه Condition فقط برای متد ها کاربرد دارد و شما میتوانید بیش از یک شرط داشته باشید. این انوتیشن دو ویژگی برای نام مقادیر ورودی پیغام خطا در صورتی که حاصل اجرا مقدار نادرستی باشد را می پذیرد.
متد شرط باید مقدار از نوع bool را بازگرداند و حداقل یک مقدار ورودی بگیرد. آرگومان های ورودی با استفاده از `,` از یکدیگر جدا می شوند و به همان ترتیب و تعداد متد شرط شما بایستی ورودی داشته باشد و نام آرکومانهای ورودی اختیاری است.
نمونه کد:
[Condition("Birthdate,Gender", "If you are boy Your age must be more than 18 years old else more than 20 years old.")] public bool CheckAgeByGender(DateTime BirthDate, bool Gender) { return Gender ? CalcualteAge(BirthDate) > 18 : CalcualteAge(BirthDate) > 20; }private int CalcualteAge(DateTime BirthDate) { var today = DateTime.Today; var age = today.Year - BirthDate.Year; if (BirthDate.Date > today.AddYears(-age)) age--; return age; }[Condition("NationalId", "Your NationalId is not valid.")] public bool NationalIdIsValid(string NationalId) { return NationalId.Length == 10; }
انوتیشن Action آخرین انوتیشنی است که شما میتوانید در کلاس قانون استفاده کنید. این انوتیشن تنها یک ویژگی را برای اولویت اجرا می پذیرد که مقدار پیش فرض آن 1 می باشد.
یک متد Action هیچ ورودی را نمی پذیرد و همچنین چیزی برای خروجی باز نمی گرداند.
نمونه کد:
[Action] public void UpdateUserInfo() { // Call a service or business to update something or do anything that you must to do Console.WriteLine("AccountRule Is passed too."); }
بعد از اینکه تمامی قوانینی که نیاز داشتید را پیاده سازی کردید، شما باید یک نمونه از کلاس Facts بسازید و تمامی مقادیری که در شروط استفاده کردید را درون آن قرار دهید. هر مقداری که در شروط خواسته شود ولی در Facts نباشد با رخ دادن خطا متوقف خواهید شد.
نمونه کد:
var facts = new Facts(); facts.Put("Birthdate", new DateTime(1988, 11, 23)); facts.Put("Gender", true); facts.Put("NationalId", "1234567890");
اکنون همه چیز برای پیاده سازی کلاس Rule و ارائه نمونه Facts ساخته شده جهت اجرا شروط آماده است.
نمونه کد:
try { Rule MyRule = new Rule(new IdentificationRule()); MyRule.Execute(facts); } catch (RuleException ruleException) { Console.WriteLine(ruleException.Message); var inner = ruleException.InnerException; while (inner != null) { Console.WriteLine(inner.Message); inner = inner.InnerException; } }
خلاصه
RuleEngineCore یک
این کتابخانه متن باز بوده و در گیت هاب موجود است، همچنین Wiki برای این کتابخانه تهیه شده که میتواند مفید واقع گردد. ضمنا شما می توانید با استفاده Nuget و یا Github release آخرین نسخه برای استفاده را تهیه نمایید. سورس کد مربوط به نمونه پیاده سازی شده در زیر آمده است و همچنین در آدرس فلان نیز قابل دسترسی است.
خوشحال خواهم شد نظرات شما دوستان را جهت توسعه هر چه بیشتر این کتابخانه دریافت کنم تا بتوانیم دنیایی جذاب برای همه توسعه دهندگان ایجاد کنیم.