امروز: چهارشنبه، 20 خرداد 1405

معرفی سیستم Bridge

معرفی :

سیستم Bridge با ایجاد ساختاری ، باعث ایجاد یک شبکه مجازی مش بر پایه پروتکل HTTP  بین سرور و کلاینت می شود.
با استفاده از این کتابخانه سرور و کلاینت می توانند با یکدیگر ارتباط برقرار کرده و اطلاعات را رد و بدل نمایند.
اطلاعاتی از قبیل همسان سازی دیتابیس بین سرور و کلاینتها ، ارسال نوتیفیکیشن از سرور به کلاینت ، تشخیص کانکت یا دیسکانکت بودن کلاینت و ...

جزییات سیستم Bridge :

*Events : در حال حاضر شامل کلاسهای BridgeEvents و BridgeEventsConfigs می باشد.کلاس BridgeEvents با ارث بری از کلاس پایه BaseEventContainer از کتابخانه HookEvents ، تمامی Event های خود را معرفی کرده که این کلاس به عنوان تایپ جنریک در متد Config کلاس BridgeEventsConfigs مورد استفاده قرار گرفته و باعث رجیستر شده Event ها به سیستم در زمان اجرای نرم افزار می گردد.

*Services : این بخش به سه قسمت Server و Client و Shared تقسیم بنده شده است.در قسمت Shared تمامی کلاسهایی که در Server و Client به صورت مشترک استفاده میشوند ، قرار گرفته است ، در قسمت کلاینت کلاس ها و اینترفیس های مرتبط به Client ها قرار داده شده است و در قسمت Server کلاس ها و اینترفیس های مرتبط به Server ها و Client ها قرار داده شده است.

جزییات قسمت Server : 

1- کلاس BridgeServerHub : این کلاس با ارث بری از سرویس BridgeServerHubBase کتابخانه Grpc ، متد های ایجاد شده در فایل Protobuf را پیاده سازی می کند.که از طریق این سرویس به ازای هر Client یک استریم باز شده و Client جدید اضافه میشود و درخواست از Server به Client ارسال میگردد.

2- کلاس BridgeClientHub : این کلاس با ارث بری از سرویس BridgeClientHubBase کتابخانه Grpc ، متد های ایجاد شده در فایل Protobuf را پیاده سازی می کند.که از طریق این سرویس هر Client بعد از ارسال درخواست یک Hubجدید برای او ایجاد شده و  به Hub Handlers اضافه میگردد و شروع به ارسال  Task های خود میکند.

3- کلاس BridgeServer : از مهمترین کلاس های سیستم Bridge می باشد که وظیفه Config کردن Server و Client ، افزودن Client جدید ، حذف یک Client ، گرفتن اطلاعات یک Client ، Start و Stop یک Server و ... به عهده دارد.

4- کلاس BridgeServerClient : وظیفه این کلاس پر کردن اطلاعات یک Client در زمان ایجاد نمونه از این کلاس و همچنین افزودن Client به ClientHubHandler و چک کردن اینکه Client به طور کامل به سرور کانکت شده است یا خیر و در نهایت دیسکانکت کردن یک Client و حذف تمام وابستگی های آن می باشد.

5- کلاس BridgeServerClientHubHandler : نظارت بر درخواست ها و پاسخ ها ، صف تسک های در انتظار اجرا و همچنین وضعیت کانتکت بودن Client ها را دارد ، که در صورت فراخوانی متد StartAsync پس از بررسی وضعیت کانکشن Clinet در صورت کانکت بودن تسک های آنرا از لیست تسک های در صف انتظار پاک کرده و آنرا اجرا میکنند . و در پایان آبجکت مورد نظر را Dispose می کند.در این کلاس متدی با نام SendRequestAsync وجود دارد که وظیفه ارسال درخواست از Server به Client را انجام میدهد.

6- کلاس BridgeServerConfigBuilder : این کلاس وظیفه مدیریت و نگه داری Device ها ، هاب های Server و Client ، کانفیگ کردن کلاس ServerPort کتابخانه Grpc ، افزودن و یا بروز رسانی هاب های Server و Client ها و همچنین ایجاد کانتینر از Event های کتابخانه Bridge با استفاده از کتابخانه HookEvents را دارد.

7- کلاس Bridge : یک کلاس استاتیک برای استفاده در تمام قسمت های نرم افزار که دارای وظایفی از قبیل راه اندازی سیستم Bridge (مانند ایجاد Container برای Event ها با استفاده از کتابخانه HookEvents) در زمان اجرای اولیه نرم افزار و گرفتن Server های در حال اجرا و همچنین افزودن یک Server به عنوان یک Server فعال و در حال اجرا.

وابستگی ها:

1- سیستم کش

    public class BridgeCacheConfig : IFileCacheConfig
    {
        public static Type FileCacheType = typeof(BridgeCacheConfig);

        public void Config(FileCacheConfigBuilder builder)
        {
            builder.RegisterCache<BridgeCacheConfig>().AddDependencies(HookEventsCacheConfig.FileCacheType);
        }
    }


2- سیستم HookEvents

    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)
        {
        }
    }

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


دسته بندی: Bridge
تاریخ: 26 شهریور 1399

معرفی سیستم HookEvents

معرفی :

سیستم 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- سیستم کش



دسته بندی: HookEvents
تاریخ: 24 شهریور 1399

معرفی سیستم کش

سیستم کش نرم افزار OneShot وظیفه خواندن و ذخیره اطلاعات دریافتی در فایل ها را دارد.

بخش های سیستم کش :

1- اینترفیس IFileCacheConfig : در حال حاضر شامل یک متد به نام Config می باشد که کلاس FileCacheConfigBuilder به عنوان ورودی میگیرد.

2- کلاس FileCacheConfigBuilder :  در حال حاضر شامل یک متد جنریک به نام RegisterCache می باشد که فایل هایی که نیاز به کش شدن را دارند توسط این متدبه سیستم مدیریت کش (FileCacheConfigHandler) رجیستر می شوند.

3- کلاس FileCacheConfigHandler : وظیفه افزودن وابستگی و یا وابستگی ها یک فایل کش را به عهده دارد.

4- کلاس FileCache :  وظایف کلاس FileCache 
   1- بارگزاری اولیه در زمان بالا آمدن برنامه که شامل خواندن تمامی فایل های کش شده به اضافه وابستگی های آنها می باشد.
   2- چک کردن اینکه کلاس مورد نظر نیازی به کش شدن دارد یا خیر.
   3- پاک کردن فایل کش از لیت فایل های کش شده.
   4- حذف وابستگی های یک فایل کش شده.
   5- حذف کردن تمام فایل های کش شده.
   6- ذخیره اطلاعات به صورت سریالایز را در فایل و یا خواندن فایل و دسریالایز کردن آن برای استفاده در برنامه.

طریقه استفاده از سیستم کش :
     1- استفاده از 

FileCache.Init();

    در آغاز برنامه جهت بارگزاری اولیه کش می باشد.

    2- جهت معرفی سیستم مورد نظر به کش برنامه ، ابتدا باید کلاسی ترجیحا با CacheConfig اتمام می یابد را ایجاد کرد و سپس از اینترفیس IFileCacheConfig ارث بری کرده و متد Config را پیاده سازی نمود.در متد کانفیگ از طریق ورودی آن که کلاس FileCacheConfigBuilder بوده و به صورت زنجیره وار می باشد به این صورت که ابتدا کلاس ایجاد شده را با متد RegisterCache به سیستم کش معرفی و رجیستر میکنیم ، در صورتی که کلاس مورد نظر وابستگی به کلاس دیگری داشت باید از طریق AddDependencies تایپ کلاس های مورد نظر را به کلاس جاری اضافه کرد.مانند مثال زیر : 

    public class BridgeCacheConfig : IFileCacheConfig
    {
        public static Type FileCacheType = typeof(BridgeCacheConfig);

        public void Config(FileCacheConfigBuilder builder)
        {
            builder.RegisterCache<BridgeCacheConfig>().AddDependencies(HookEventsCacheConfig.FileCacheType);
        }
    }


   3- استفاده از متد جنریک GetAndSet جهت ذخیره و خواندن فایل کش به صورت زیر :
FileCache.GetAndSet<TCache, TResult>(Func<TResult> func, uint counter = 0)

 * TCache : نام کلاسی که از اینترفیس IFileCacheConfig ارث بری کرده است.
* TResult : خروجی براساس نیاز کلاس مورد نظر.
*counter : زمانی مورد استفاده قرار میگیرد که بخواهیم از یک کلاس چندین نمونه فایل کش با یک اسم ثابت داشته باشیم.در اینصورت به تعداد کلاس های مورد نیاز شمارنده را میدهیم.مقدار پیش فرض 0 می باشد.به عنوان مثال اگر از یک کلاس 4 نمونه کش بخواهیم به صورت زیر انجام میگیرد.ClassCache-3,ClassCache-2,ClassCache-1,ClassCache-0

   4- استفاده از متد Remove ، جهت پاک کردن فایل کش شده از سیستم.

   5- استفاده از متد RemoveAll، جهت پاک کردن کلیه فایلهای کش شده از سیستم.

   6- استفاده از متد RemoveDependencies ، جهت پاک کردن وابستگی های فایل کش شده از سیستم.