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

سیستم 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);
            });
        }
    }