یک: ASP.NET Core مستقل از Platform است
آیندهی محتوم نرمافزار، توسعه به شیوههای مستقل از Platform است. شاید این دلیل به تنهایی برای مهاجرت به ASP.NET Core کافی باشد. امروزه نرمافزارهایی که مبتنی بر یک Platform خاص نیستند، نسبت به سایر نرمافزارها مزیت رقابتیتری دارند. نرمافزارهای Cross Platform یا مستقل از Platform، بر روی هر سیستم عاملی اجرا میشوند. برای اجرای آنها در کامپیوترهای شخصی یا Server کافیست معماری پردازندهی مرکزی x86 باشد و سیستم عامل نیز یکی از انواع ویندوز، لینوکس یا مک.
دلیل مستقل بودن ASP.NET Core از Platform، مبتنی بودن آن بر NET Core. است. این نسخه از داتنت را میتوان برای سیستمعاملهای مختلف از http://dot.net دانلود و نصب کرد.
برای اجرای نرمافزارهایی که مبتنی بر NET Core. هستند نیاز به بازنویسی کدها یا استفاده از زبانهای برنامهنویسی جداگانهای نیست. این خاصیت همچنین برای libraryهای استانداردی که از این نسخه از داتنت استفاده میکنند نیز صادق است.
دو: Open Source است
یکی از انتقادهایی که سالها به مایکروسافت میشد، ناشناخته بودن سورس نرمافزارهای این شرکت و انحصار طلبیهایش بود. اما در سالهای اخیر مایکروسافت نشان دادهاست که این جنبه از کاراکترش را به تدریج اصلاح کردهاست. به طوری که اسکات هانسلمن، یکی از کارمندان این شرکت و وبلاگنویس مشهور در این مورد گفته است:
دلیل آمدن من به مایکروسافت این بود که میخواستیم هر چقدر میتوانیم کارها را Open Source کنیم و یک جامعهی کاربری برای داتنت و اوپن سورس بسازیم و حالا به NET Core 1.0. رسیدهایم.
زمانی شایعهی لو رفتن بخشی از سورس کد ویندوز ۹۵، در صدر اخبار تکنولوژی بود و این یک شکست برای مایکروسافت محسوب میشد. اما امروزه ASP.NET Core با لایسنس MIT عرضه شده است که یکی از آزادترین مجوزهای اوپن سورس است. نرمافزارهایی که با این مجوز عرضه میشوند، آزادی تغییر کد، ادغام با مجوزهای دیگر، عرضه به عنوان محصول دیگر، استفاده تجاری و ... را به همهی توسعهدهندگان میدهد.
سه: جدا بودن از Web Server
این نسخهی از APS.NET، کاملاً از وبسرور که نرمافزارها را هاست میکند، جدا (decouple) شده است. اگرچه همچنان استفاده از IIS بر روی ویندوز منطقی به نظر میرسد اما مایکروسافت یک پروژهی اوپن سورس دیگری را به نام Kestrel نیز منتشر کرده است.
وبسرور Kestrel مبتنی بر پروژه libuv است و libuv در اصل برای هاست کردن Node.js تولید شده بود و تأکید آن بر روی انجام عملیات I/O به صورت asynchronous است.
نکته جالب این است که یک برنامهی مبتنی بر ASP.NET Core، در واقع یک Console Application است که در متد Main آن وبسرور فراخوانی میشود:
using System;
using Microsoft.AspNetCore.Hosting;
namespace aspnetcoreapp
{
public class Program
{
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseStartup<Startup>()
.Build();
host.Run();
}
}
}
چهار: تزریق وابستگی (Dependency Injection) تو کار
تزریق وابستگیها برای ایجاد وابستگی سست (loosely coupling) بین اشیاء مرتبط و وابسته به یکدیگر است. به جای نمونهسازی مستقیم اشیاء مرتبط، یا استفاده از ارجاعهای ایستا به آن اشیاء، زمانی که یک کلاس به آنها احتیاج داشته باشد، با روشهای خاصی از طریق DI به اشیاء مورد نیاز دسترسی پیدا میکند. در این استراتژی، ماژولهای سطح بالا نباید به ماژولهای سطح پایین وابسته باشند، بلکه هر دو باید به abstraction (معمولا Interface ها) وابسته باشند.
وقتی یک سیستم برای استفادهی از DI طراحی شدهاست و کلاسهای زیادی دارد که وابستگیهایش را از طریق constructor یا propertyها درخواست میکند، بهتر است یک کلاس مخصوص ایجاد آن کلاسها و وابستگیهایشان داشته باشد. به این کلاسها container، یا Inversion of Control (IoC) container یا Dependency Injection (DI) container گفته میشود.
با این روش، بدون نیاز به hard code کردن instance سازی از کلاسها، میتوان گرافهای پیچیده وابستگی را در اختیار یک کلاس قرار داد.
طراحی ASP.NET Core از پایه طوری است که حداکثر استفاده را از Dependency Injection میکند. یک container ساده توکار با نام IServiceProvider وجود دارد که به صورت پیشفرض constructor injection را پشتیبانی میکند.
در ASP.NET Core با مفهومی به نام service سر و کار خواهید داشت که در واقع به type هایی گفته میشود که از طریق DI در اختیار شما قرار میگیرند. سرویسها در متد ConfigureServices کلاس Startup برنامه شما تعریف میشوند. این serviceها میتوانند Entity Framework Core یا ASP.NET Core MVC باشند یا سرویسهایی که توسط شما تعریف شدهاند. مثال:
public void ConfigureServices (IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddMvc();
services.AddTransient<IEmailSender, AuthMessageSender>();
services.AddTransient<ISmsSender, AuthMessageSender>();
}
پنج: یکپارچگی با frameworkهای مدرن سمت کلاینت
فرآیند build در برنامههای تحت وب مدرن معمولاً این وظایف را انجام میدهد:
-
bundle و minify کردن فایلهای جاوا اسکریپت و همینطور CSS
-
اجرای ابزارهایی برای bundle و minify کردن قبل از هر build
-
کامپایل کردن فایلهای LESS و SASS در CSS
-
کامپیال کردن فایلهای CoffeeScript و TypeScript در JavaScript
برای اجرای چنین فرآیندهایی از ابزاری به نام task runner استفاده میشود که Visual Studio از دو ابزار task runner مبتنی برا جاوا اسکریپت به نامهای Gulp و Grunt بهره میبرد. از این ابزارها با استفاده از ASP.NET Core Web Application template میتوان در ASP.NET Core استفاده کرد.
همچنین امکان استفاده از Bower که یک package manager (مانند NuGet) برای وب است، وجود دارد. معمولاً از Bower برای نصب فایلهای CSS ، فونتها، frameworkهای سمت کلاینت و کتابخانههای جاوا اسکریپت استفاده میشود. اگرچه بسیاری از packageها در NuGet هم وجود دارند، اما تمرکز بیشتر NuGet بر روی کتابخانههای داتنتی است.
نصب و استفادهی سایر libraryهای سمت کلاینت مانند Bootstrap ، Knockout.js ، Angular JS و زبان TypeScript نیز در Visual Studio و هماهنگی آن با ASP.NET Core نیز بسیار ساده است.
پس همین حالا دست به کار شوید و با نصب -حداقل - Microsoft Visual Studio 2015 Update 3 بر روی ویندوز یا Visual Studio Code بر روی هر سیستم عاملی از برنامهنویسی با ASP.NET Core لذت ببرید!
منابع :