معماری کلی ناپ کامرس | ساختار پیازی (Onion Architecture)
ناپ کامرس بر اساس معماری پیازی (Onion Architecture) طراحی شده است. در این معماری، همه کدها میتوانند به لایههای مرکزیتر وابسته باشند، اما کدها نمیتوانند به لایههای بیرونیتر از هسته وابسته شوند [citation:3]. به عبارت دیگر، تمام وابستگیها به سمت مرکز است. این ویژگی باعث کاهش وابستگی (Decoupling) کدها و افزایش قابلیت تستپذیری و نگهداری میشود.
مزیت اصلی این معماری این است که میتوانید هسته برنامه را بدون نیاز به هیچ رابط کاربری (UI) تست کنید، یا فریمورک UI خود را از Razor View به Angular، React یا Vue تغییر دهید بدون اینکه تغییری در هسته اصلی ایجاد شود [citation:3].
پروژههای اصلی ناپ کامرس | لایههای هسته (Application Core)
هسته برنامه (Application Core) در پوشه Libraries قرار دارد و شامل سه پروژه اصلی است که به ترتیب از مرکز به بیرون، وابستگیهای یکطرفه دارند [citation:3][citation:11].
پروژه Nop.Core | مرکز معماری
پروژه Nop.Core در مرکز معماری قرار دارد و به هیچ پروژه دیگری در راهحل وابسته نیست [citation:3][citation:11]. این پروژه شامل کلاسهای اصلی و مشترک در کل سیستم است، از جمله:
- موجودیتهای دامنه (Domain Entities): مانند کلاسهای Order، Customer و Product.
- سیستم کش (Caching): رابطها و پیادهسازیهای مربوط به کشسازی.
- سیستم رویداد (Events): ساختارهای مورد نیاز برای مدیریت رویدادها.
- کلاسهای کمکی (Helpers): توابع و ابزارهای عمومی مورد استفاده در کل سیستم [citation:3][citation:11].
پروژه Nop.Data | لایه دسترسی به داده
پروژه Nop.Data به پروژه Nop.Core وابسته است و در میانه معماری قرار دارد [citation:3][citation:11]. این پروژه وظیفه ارتباط با پایگاه داده و جداسازی منطق دسترسی به داده از اشیاء کسبوکار را بر عهده دارد. ناپ کامرس از رویکرد Code-First با استفاده از Linq2DB و FluentMigrator استفاده میکند [citation:8][citation:11].
در این رویکرد، موجودیتها در کد منبع (پروژه Nop.Core) تعریف میشوند و سپس از Linq2DB و FluentMigrator برای تولید ساختار پایگاه داده از این کلاسهای C# استفاده میشود [citation:8][citation:11]. همچنین، برای شخصیسازی نگاشت (Mapping) جداول، از API روان (Fluent API) در کلاسهای Builder موجود در پوشه Mapping استفاده میشود [citation:8].
پروژه Nop.Services | لایه سرویسها و منطق کسبوکار
پروژه Nop.Services بیرونیترین لایه هسته برنامه است که به هر دو پروژه Nop.Core و Nop.Data وابسته است [citation:3][citation:8][citation:11]. این پروژه شامل سرویسهای اصلی، منطق کسبوکار (Business Logic)، اعتبارسنجیها و محاسبات مربوط به دادهها است [citation:3][citation:11].
ویژگی کلیدی این لایه: استفاده از الگوی Repository و Dependency Injection است. برای مثال، سرویسهای مربوط به بلاگ (Blog) در پوشه Blogs قرار دارند و شامل یک سرویس و یک اینترفیس هستند. این طراحی به شما امکان میدهد تا پیادهسازی سرویس را بدون تغییر در کنترلرها و سایر بخشها، به سادگی تعویض کنید [citation:8].
سیستم کش (IStaticCacheManager) در عملکرد ناپ کامرس
یکی از اجزای حیاتی در آموزش عملکرد ناپ کامرس، سیستم کشسازی است. ناپ کامرس از رابط IStaticCacheManager با سه پیادهسازی مختلف استفاده میکند [citation:1]:
- MemoryCacheManager: برای سرورهای تکواحدی (Single-Server) که از حافظه سرور برای کش استفاده میکند.
- SynchronizedMemoryCacheManager: برای محیطهای چندسروره با سیگنالهای اعتبارسنجی (Invalidation Signals).
- DistributedCacheManager: برای استفاده از کش توزیعشده مانند Redis یا SQL Server.
همچنین، ناپ کامرس از ILocker برای قفلهای توزیعشده جهت جلوگیری از هجوم همزمان به کش (Cache Stampede) استفاده میکند [citation:1].
سیستم افزونهپذیری (Plugin System) در عملکرد ناپ کامرس
یکی از قویترین بخشهای آموزش عملکرد ناپ کامرس، سیستم افزونهپذیری آن است. افزونهها مجموعههایی از کد هستند که قابلیتهای خاصی را به فروشگاه اضافه میکنند و میتوانند شامل لایههای داده، منطق کسبوکار و رابط کاربری خود باشند [citation:8].
ساختار افزونهها
افزونهها در پوشه /Plugins در ریشه راهحل قرار دارند. اما فایلهای DLL آنها به طور خودکار به پوشه Presentation\Nop.Web\Plugins کپی میشوند تا شامل فایلهای استاتیک (مانند CSS یا JS) نیز باشند [citation:8][citation:11].
چرخهحیات افزونه (BasePlugin)
هر افزونه یک کلاس اصلی دارد که از BasePlugin ارثبری میکند و متدهای زیر را پیادهسازی میکند [citation:1]:
- InstallAsync / UninstallAsync: برای نصب و حذف افزونه.
- UpdateAsync: برای بهروزرسانی افزونه بین نسخهها.
- PreparePluginToUninstallAsync / InstallSampleDataAsync: برای آمادهسازی حذف یا نصب دادههای نمونه.
مهاجرتهای پایگاه داده در افزونهها
افزونهها میتوانند از ویژگی NopMigrationAttribute با نسخهگذاری زمانمحور (Timestamp-based) استفاده کنند تا مهاجرتهای پایگاه داده خود را مدیریت کنند. این روش از تداخل نسخهها در افزونههای مختلف جلوگیری میکند [citation:1].
سیستم رویداد (Event System) و IConsumer
سیستم رویداد در ناپ کامرس یکی از ابزارهای قدرتمند برای افزونهنویسی است. هر افزونه میتواند با پیادهسازی اینترفیس IConsumer<T> به رویدادهای مختلفی مانند OrderPlacedEvent، EntityInsertedEvent و EmailSubscribedEvent گوش دهد [citation:1].
نکته مهم: متدهای InsertAsync، UpdateAsync و DeleteAsync در IRepository<TEntity> به طور پیشفرض رویدادهای EntityInsertedEvent، EntityUpdatedEvent و EntityDeletedEvent را فعال میکنند. این ویژگی به بسیاری از توسعهدهندگان افزونه امکان میدهد بدون تغییر در کد هسته، به هر تغییری در موجودیتها واکنش نشان دهند [citation:1].
لایه نمایش (Presentation Layer) و مسیریابی
لایه نمایش (Presentation Layer) در پوشه Presentation قرار دارد و شامل دو پروژه اصلی است [citation:8][citation:11].
پروژه Nop.Web | لایه نمایش عمومی و مدیریت
پروژه Nop.Web یک پروژه MVC است که هم رابط کاربری عمومی فروشگاه و هم پنل مدیریت (به عنوان یک Area) را شامل میشود [citation:8][citation:11]. این پروژه نقطه شروع (Startup Project) برنامه است و شامل کنترلرها، مدلها، ویوها و فایلهای استاتیک (wwwroot) میباشد [citation:8][citation:11].
پروژه Nop.Web.Framework | چارچوب لایه نمایش
پروژه Nop.Web.Framework یک پروژه Class Library است که شامل موارد مشترک لایه نمایش مانند کلاسهای پایه کنترلر، فیلترها و ابزارهای کمکی است [citation:8][citation:11].
ثبت سرویسها و INopStartup
ناپ کامرس از الگوی Dependency Injection با استفاده از Autofac استفاده میکند [citation:1]. هر ماژول با پیادهسازی اینترفیس INopStartup، سرویسهای خود را ثبت میکند. موتور اصلی (NopEngine) با استفاده از ITypeFinder این کلاسها را پیدا کرده، بر اساس Order مرتبسازی کرده و به ترتیب اجرا میکند [citation:1].
مدیریت فروشگاههای چندگانه (Multi-Store) در عملکرد ناپ کامرس
یکی از قابلیتهای پیشرفته ناپ کامرس، پشتیبانی از فروشگاههای چندگانه است. WebStoreContext با بررسی هدر Host درخواست، فروشگاه مربوطه را شناسایی کرده و تمام سرویسهای پاییندست را بر اساس آن اسکوپ میکند. همچنین، IStoreMappingService.AuthorizeAsync برای اعمال دسترسیهای هر فروشگاه بر روی رکوردهای مشترک استفاده میشود [citation:1].
نتیجهگیری
آموزش عملکرد ناپ کامرس نشان میدهد که این پلتفرم با معماری لایهای و انعطافپذیر خود، یکی از بهترین گزینهها برای فروشگاههای اینترنتی است. از هسته مرکزی (Nop.Core) و لایه دسترسی به داده (Nop.Data) تا لایه سرویسها (Nop.Services) و سیستم افزونهپذیری قدرتمند، همه چیز به گونهای طراحی شده که توسعهدهندگان بتوانند به راحتی فروشگاه را شخصیسازی کرده و قابلیتهای جدید اضافه کنند [citation:1][citation:5].
اگر در هر مرحله از آموزش عملکرد ناپ کامرس با سوالی مواجه شدید، خوشحال میشویم در بخش نظرات به شما کمک کنیم. موفق و پیروز باشید!
توجه: این مقاله بر اساس مستندات رسمی ناپ کامرس و تجربه توسعهدهندگان حرفهای تهیه شده است. برای آخرین تغییرات، همواره به مستندات رسمی و مخزن GitHub مراجعه کنید.
