این تحقیق توسط حمزه معاضدی انجام شده است
در این معماری، همه چیز، هسته برنامه را احاطه کرده است.هسته یک مؤلفه آگنوستیک فناوری است که شامل تمام منطق است. در پیادهسازی این قسمت وجود چیزهای دیگر در بیرون را باید به کلی نادیده گرفت.به عبارت دیگر، هسته اصلی نباید از نحوه ارائه برنامه یا محل نگهداری داده ها آگاه باشد.
هسته را می توان به عنوان یک "جعبه" (که به عنوان یک شش ضلعی نشان داده می شود) مشاهده کرد که قادر به حل همه منطق تجاری، مستقل از زیرساختی است که برنامه در آن نصب شده است.این رویکرد به ما این امکان را می دهد که هسته را به صورت مجزا آزمایش کنیم و به ما این امکان را می دهد که به راحتی اجزای زیرساخت را تغییر دهیم.
اکتورها (actors ):
اکتورها چیزهای دنیای واقعی هستند که می خواهند با هسته اصلی تعامل داشته باشند.این چیزها می تواند انسان، پایگاه داده یا حتی برنامه های کاربردی دیگر باشد.بسته به اینکه چه کسی باعث ایجاد تعامل می شود، اکتورها را می توان به دو گروه دسته بندی کرد:
Drivers (or primary) actors :
اکتورهایی هستندکه ارتباط با هسته را خود کلید میزنند.آنها این کار را برای فراخوانی یک سرویس خاص در هسته انجام می دهند.یک کاربرانسانییا یک CLI (واسط خط فرمان) نمونه های کاملی از درایور اکتور ها هستند.
Driven (or secondary) actors :
اکتورهایی هستند که انتظار دارند هسته اصلی آغاز کننده یارتباط باشد.در این صورت، هسته است که به چیزی نیاز دارد که اکتورارائه میکند، بنابراین درخواستی را برای اکتورارسال می کند و اقدام خاصی را بر روی آن درخواستمی دهد.به عنوان مثال، اگر هسته نیاز به ذخیره داده ها در پایگاه داده MySQL داشته باشد، هسته ارتباط را برای اجرای کوری INSERT در کلاینت MySQL راه اندازی می کند.
توجه داشته باشید که اکتورها و هسته اصلی به زبانهای مختلفی صحبت میکنند.یک برنامه خارجی درخواستی را از طریق http ارسال می کند تا یک درخواست برای انجام سرویسی از هستهرا فراخوانی کند (در حالیکه هستهمعنی http را نمی فهمد).مثال دیگر زمانی است که هسته اصلی (که دارای تکنولوژی آگنوستیک است) می خواهد داده ها را در پایگاه داده mysql (که با زبان SQL صحبت می کند) ذخیره کند.
با این اوصاف، باید «چیزی» وجود داشته باشد که بتواند به ما در انجام چنین ترجمههایی کمک کند. اینجا جایی است که پورت ها و آداپتورها به بازی می آیند.
Ports ( پورت ها ) :
از یک طرف، ما پورت هایی داریم که رابط(اینترفیس) هایی هستند که نحوه برقراری ارتباط بین یک اکتورو هسته را مشخص می کنند.بسته به اکتور، پورت ها ماهیت متفاوتی دارند:
. پورت هایی برای اکتور های درایور:
پورتها برای اکتور های dirver مجموعه اقداماتی را که هسته ارائه میکند و در معرض بیرون قرار میدهد، تعریف میکند.هر عمل به طور کلی با یک مورد خاص از استفاده مطابقت دارد.
. پورت هایی برای driven actor ها :
مجموعه اقداماتی را که اکتورباید اجرا کند را تعریف می کند.
توجه داشته باشید که پورت ها متعلق به هسته هستند.مهم است، زیرا هسته اصلی موجودیتیاست که تعریف می کند که کدام تعامل برای دستیابی به اهداف منطقی تجاری مورد نیاز است
Adapters ( آداپتور ها) :
از سوی دیگر، ما آداپتورهایی داریم که مسئول تبدیل بین یک درخواست از اکتوربه هسته هستند و بالعکس.
این امر ضروری است، زیرا همانطور که قبلاً گفتیم بازیگران و هسته اصلی به زبان های مختلف "صحبت" می کنند.
. یک آداپتور برای یک پورت driver ، یک درخواست فناوری خاص را به یک تماس در یک سرویس اصلی تبدیل می کند.
. یک آداپتور برای یک پورت driven ، یک درخواست مستقل از فناوری از سویهسته را به یک درخواست فناوری خاص از اکتورتبدیل می کند
Dependency injection ( تزریق وابستگی )
پس از اتمام پیاده سازی، لازم است به نحوی آداپتورها را به پورت های مربوطه متصل کنید.این می تواند زمانی انجام شود که برنامه شروع شود و به ما امکان می دهد تصمیم بگیریم که کدام آداپتور باید در هر پورت وصل شود، این همان چیزی است که ما به آن "تزریق وابستگی" می گوییم.
برای مثال، اگر میخواهیم دادهها را در یک پایگاه داده mysql ذخیره کنیم، فقط باید یک آداپتور برای پایگاه داده mysql به پورت مربوطه وصل کنیم یا اگر میخواهیم دادهها را در حافظه اصلیذخیره کنیم (برای آزمایش) باید یک آداپتور in memory database را به آن پورت وصل کنیم.