امروز: چهارشنبه، 9 آبان 1403
06/24 1399
معرفی :

سیستم HookEvents یک پروژه میان افزار است که این امکان را برای نرم افزار ایجاد میکند که بدون وابستگی و از هر جای پروژه ، یک متد یا Event را فراخوانی کنیم ، به این صورت که پروژه ها و کتابخانه های دیگر Event های خود را ابتدا از طریق کلاسها و متد های HookEvents به برنامه رجیستر میکنند و سپس از طریق کانتینرهای خود به Event ها دسترسی دارند.
برای استفاده میتوان از سایر قسمتهای پروژه به Event ها Hook کرد.

جزییات سیستم HookEvents :
1- کلاس BaseEventContainer : کتابخانه هایی که می خواهند Event های خود را رجیستر کنند ، ابتدا باید کلاسی که ترجیحا با Events به پایان میرسد را ساخته و سپس از کلاس BaseEventContainer ارث بری نمایند و Event های مورد نیاز خود را در این کلاس پیاده سازی نمایند. مانند :
    public class BridgeEvents : BaseEventContainer
    {
        public string EN_BeforeRunServer => "BeforeRunServer";
        public string EN_AfterRunServer => "AfterInitServer";
        public string EN_AfterStartServer => "AfterStartServer";
        public string EN_AfterStopServer => "AfterStopServer";

        public virtual void BeforeRunServer(IBridgeServerConfigBuilder serverConfig)
        {
        }

        public virtual void AfterInitServer(IBridgeServer server)
        {
        }

        public virtual void AfterStartServer(IBridgeServer server)
        {
        }

        public virtual void AfterStopServer(IBridgeServer server)
        {
        }
    }

2- کانفیگ ها :

   1- کلاس EventConfig : با استفاده از این کلاس وضعیت Event ها را مانند Async یا Sync بودن، Singleton بودن و همچنین نوع Exception مشخص می کنیم. 

   2- کلاس EventConfigBuilder : با استفاده از این کلاس کانفیگ Event ها و Hook ها گرفته و در حافظه سیستم نگه داری می شود . میتوان Event ها به صورت انفرادی و کلی به سیستم معرفی نمود،  Hook جدید به Hook Container اضافه کرد و همچنین بررسی کنیم که Event و یا Hook درخواستی به صورت Singleton هست یا خیر.

  3- کلاس HookConfig : با استفاده از این کلاس وضعیت Hook را مانند سطح اهمیت Hook،مقدار درجه اهمیت ، Singleton بودن و همچنین نوع Exception را مشخص میکنیم.

  4- کلاس HookConfigBuilder : با استفاده از این کلاس کانفیگ Hook ها گرفته و در حافظه سیستم نگه داری می شود . میتوان Hook ها به صورت انفرادی و کلی به سیستم معرفی نمود و همچنین بررسی کنیم که Event و یا Hook درخواستی به صورت Singleton هست یا خیر.

  5- کلاس HookEventsConfigBuilder : در حال حاضر حاوی دو متد RegisterEvent و RegisterHook می باشد که به عنوان ورودی متد Config در اینتر فیس IHookEventsConfig واقع شده است که وظیفه رجیستر کردن Event ها و Hook ها را از طریق Reflection در زمان اجرا برنامه به عهده دارد.

    public interface IHookEventsConfig
    {
        void Config(HookEventsConfigBuilder builder);
    }

طریقه استفاده : 

        public void Config(HookEventsConfigBuilder builder)
        {
            builder.RegisterEvent<BridgeEvents>(config =>
            {
                config.Event(e => e.EN_AfterRunServer).SetExceptionType(EventExceptionType.Skip);
            });
        }


2-کلاس HookEvents : این کلاس شامل متد هایی است مانند :
Init (تمامی Event هایی که از طریق متد Config اینترفیس IHookEventsConfi به سیستم معرفی شده است را خوانده در برنامه رجیستر میکند و در صورتی که قبلا کش نشده بود از طریق کتابخانه Cache در فایل مربوط به خود کش میکند).
RegisterEvent (کتابخانه های دیگر از طریق این متد می توانند Event خود را درسیستم رجیستر کنند).
RegisterHook(کتابخانه های دیگر از طریق این متد می توانند Hook های مرتبط به Event خود را در سیستم رجیستر کنند).
Container(از طریق این متد پروژه ها و کتابخانه های دیگر میتوانند Event های خود را در کانتینر خود قرار داده تا پس از ایجاد یک Proxy ، بتوانند از طریق این کانتینر در قسمتهای مختلف برنامه به Event های خود دسترسی داسته باشند).

3- کلاس HookEventsInterceptor : پس از ایجاد Proxy برای  HookEvents، یک Castle Interceptor ایجاد می کند که تمام Hook هایی که به Event های مختلف الصاق شده را مورد مشاهده قرار میدهد .به عنوان مثال کانفیگ Hook را گرفته و در صورتی که زمان اجرا آن Event بود ، Event را Fire میکند و زمان آغاز و پایان Event را ثبت میکند و در صورتی که خطایی بروز داد ، بر اساس تنظیماتی که در زمان رجیستر کردن Event و Hook به آنها داده ایم ، تصمیم بر ادامه روند یا خروج از روند برنامه میگیرد.

طریقه استفاده : 

1-ارث بری از اینترفیس IHookEventsConfig و پیاده سازی متد های آن ، که باعث میشود به صورت اتومات تمامی Event ها رجیستر شوند.

    public class BridgeEventsConfigs : IHookEventsConfig
    {
        public void Config(HookEventsConfigBuilder builder)
        {
            builder.RegisterEvent<BridgeEvents>(config =>
            {
                config.Event(e => e.EN_AfterRunServer).SetExceptionType(EventExceptionType.Skip);
            });
        }
    }

2- استفاده از متد RegisterEvent و RegisterHook کلاس HookEvents برای رجیستر کردن Event ها و Hook ها به برنامه.
HookEvents.Instance.RegisterEvent(
            config =>
            {
                config.Event(e => e.EN_AfterRunServer).SetExceptionType(EventExceptionType.Skip);
            }
);

3-صدا زدن متد Init از کلاس HookEvents در زمان اجرا برنامه.
HookEvents.Instance.Init()

4- برای اجرا Event ها ابتدا Container آن را از HookEvents دریافت می شود و در قسمت مورد نیاز Event مورد نظر را اجرا می کنیم:
public static void MyMethod()
        {
            Events = HookEvents.Instance.Container<BridgeEvents>();

            //Fire AfterInitServer Event        
            Events.AfterInitServer(server);
        }

وابستگی ها:

1- سیستم کش