معرفی قالب پروژه Web API مبتنی‌بر ASP.NET Core Web API و زیرساخت DNTFrameworkCore
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: دو دقیقه

بعد از انتشار نسخه اولیه زیرساخت DNTFrameworkCore، در این مطلب قصد دارم قالب تهیه شده برپایه زیرساخت مذکور را معرفی کنم. در این قالب سیستم اعتبارسنجی کاربران مبتنی‌برJWT نیز تدارک دیده شده است.
‌‌‌

نصب قالب پروژه از طریق نیوگت


ابتدا برای نصب قالب تهیه شده از طریق نیوگت، دستور زیر را اجرا کنید:
dotnet new --install DNTFrameworkCoreTemplateAPI::*‌‌
‌‌
حال برای ایجاد اولین پروژه، دستور زیر را اجرا کنید:
dotnet new dntcore-api
‌‌
بعد از اجرای دستور بالا، ساختاری مشابه شکل زیر در اختیار شما می‌باشد:


بررسی قسمت‌های مختلف قالب پروژه

1- پروژه Domain دربرگیرنده Domain Model سیستم می‌باشد؛ تفاوتی ندارد Rich Domain Model یا Anemic Domain Model باشد. به عنوان مثال، به صورت پیش‌فرض موجودیت‎‌های مرتبط سیستم احراز هویت و کنترل دسترسی در این قالب طراحی شده‌اند.


2- پروژه Infrastructure دربرگیرنده DbContext، مهاجرت‌ها و کلاس‌های تنظیمات نگاشت موجودیت‌ها به جداول بانک اطلاعاتی پروژه می‌باشد. به عنوان مثال، به صورت پیش‌فرض تنظیمات نگاشت موجودیت‌های کاربر و گروه‌کاربری و موجودیت‌های وابسته آنها در این قالب پیاده‌سازی شده‌اند. همچنین دو مهاجرت CreateInitialSchema و CreateIdentitySchema ایجاده شده‌اند.



3- پروژه Application دربرگیرنده مدل‌ها/DTOها‎‌، اعتبارسنج‌های مدل‌ها، سرویس‌ها و همچنین Eventهای سفارشی و Handlerهای رویدادهای متناظر با موجودیت‌های سیستم، می‌باشد. همانطور که شکل زیر ملاحظه می‌کنید، برای موجودیت‌های کاربر و گروه‌کاربری طراحی و پیاده‌سازی پیش‌فرضی از قسمت‌های مذکور ارائه شده است.


4- پروژه Resouces دربرگیرنده فایل‌های منبع resx می‌باشد و همچنین به صورت پیش‌فرض بحث انتقال منابع به یک اسمبلی جداگانه نیز اعمال شده است.


5- از پروژه Common نیز می‌توان به عنوان دربرگیرنده کلاس‌های کمکی مورد استفاده در سایر قسمت‌ها، بهره برد.

6- پروژه UnitTests دربرگیرده آزمون‌های واحد پروژه می‌باشد. به عنوان مثال، به صورت پیش‌فرض آزمون‌های واحد مرتبط با UserValidator و RoleValidator به صورت کامل در این قالب تدارک دیده شده است.

7- پروژه IntegrationTests دربرگیرنده آزمون‌های جامعیت مرتبط با پروژه می‌باشد. به عنوان مثال، آزمون‌های جامعیت متناظر با سرویس‌های کاربر و گروه‌کاربری نیز در این قالب تدارک دیده شده است.

نکته: بدلیل اینکه مکانیزم اعتبارسنجی خودکار ورودی‌ها به عنوان یک Aspect برروی این سرویس‌ها اعمال شده است و بدین ترتیب در فرآیند تست سرویس‌ها نیز دخالت دارند، به صورت ناخواسته به سمت آزمون جامعیت سوق پیدا کرده‌ایم. با این حال اگر برای لایه بالاتر/خارجی پروژه خود یا همان API در قالب، قصد تهیه آزمون جامعیت داشته باشید، می‌توانید این تنظیمات ValidationInterceptor را از فایل ApplicationRegistry در پروژه Application حذف کرده و آزمون‌های سرویس‌ها را در قالب آزمون واحد انجام دهید. با این حال باید توجه کنید که برای برخی از سناریوها که امکانات هیچ کدام از مهیاکننده‌های InMemory و SQLite درون حافظه، جوابگوی نیاز شما نباشد، نیاز خواهید داشت تا از بانک اطلاعاتی واقعی از جمله LocalDb استفاده کنید؛ در این صورت آزمون‌های شما نیز در ردیف آزمون‌های جامعیت قرار خواهند داشت. 


8- پروژه API دربرگیرنده کنترلرها، هاب‌های SignalR،  زیرساخت Authentication مبتنی‌بر JWT و سایر تنظیمات آغازین پروژه، می‌باشد. CRUD API متناظر با موجودیت‌های کاربر و گروه‌کاربری نیز در این قالب تدارک دیده شده است.


کدهای کامل این قسمت را می‌توانید از اینجا دریافت کنید. 

  • #
    ‫۵ سال و ۴ ماه قبل، سه‌شنبه ۱۰ اردیبهشت ۱۳۹۸، ساعت ۰۳:۱۹
    با سلام و تشکر از ارائه پروژه نمونه; توضیحات بیشتری در مورد پروژه Resources می‌دهید؟ نقش LabelLocalizer و سایر کلاسهای موجود در این اسمبلی چیست؟
  • #
    ‫۵ سال و ۳ ماه قبل، جمعه ۱۰ خرداد ۱۳۹۸، ساعت ۱۶:۴۰
    یه سوال در مورد لایه Resources داشتم
    اگر بحث چندزبانه بودن سایت در بانک اطلاعاتی دیده بشه (یعنی از نام نمایشی ViewModel‌ها ، متن‌های سایت و ...) آیا این روش شما کاملا این مورد رو پوشش میدهد؟

    • #
      ‫۵ سال و ۳ ماه قبل، جمعه ۱۰ خرداد ۱۳۹۸، ساعت ۱۶:۵۵
      برای انتقال این منابع به یک بانک اطلاعاتی، نیاز است مهیا کننده مرتبط با آن را طراحی و پیاده‌سازی کنید. به عنوان مثال کتابخانه Localization.SqlLocalizer به عنوان یک راه‌حل می‌تواند مورد استفاده قرار گیرد. 
  • #
    ‫۵ سال و ۱ ماه قبل، پنجشنبه ۱۰ مرداد ۱۳۹۸، ساعت ۱۶:۴۷
    سلام من قالب رو از طریق dotnet new --install DNTFrameworkCoreTemplateAPI::*‌‌  نصب کردم و پروژه جدید ایجاد کردم وقتی پروژه اجرا میشه دیتابیش ساخته میشه و seed هم انجام میشه ولی پروژه بالا نمیاد و فقط log ایجاد میکنه مشکل چی میتونه باشه؟!؟!؟
    روند اجرای پروژه:
    0-change ConnectionString
    1-add_migration
    2-update_db
    3-dotnet_restore
    4-dotnet_run

    • #
      ‫۵ سال و ۱ ماه قبل، پنجشنبه ۱۰ مرداد ۱۳۹۸، ساعت ۱۶:۵۸
      برای رفع خطای زیر
      System.Data.SqlClient.SqlException (0x80131904): There is already an object named 'NumberedEntity' in the database.
      بهتر هست بانک اطلاعاتی آزمایشی برنامه را یکبار حذف/drop کنید و مجددا از طریق مراحلی که گفتید از صفر ایجادش کنید.
      • #
        ‫۵ سال و ۱ ماه قبل، پنجشنبه ۱۰ مرداد ۱۳۹۸، ساعت ۱۷:۲۲
        این کار انجام شده ولی مشکل حل نشد