بررسی کلاس Program.cs در ASP.NET Core

بررسی کلاس Program.cs در ASP.NET Core

در این پست از وبسایت پرووید، در رابطه با بررسی کلاس Program.cs در ASP.NET Core صحبت خواهیم کرد. به ادامه ی مطلب بروید.

در این قسمت از سری آموزش رایگان و  متنی ASP.NET Core از وب سایت پرووید در رابطه با فایل Program.cs صحبت خواهیم کرد.

شاید جالب باشد بدانید که وب اپلیکیشن هایی که با ASP.NET Core نوشته می شوند در واقع پروژه های کنسولی هستند که بر اساس Entry Point یا نقطۀ ورودشان کار می کنند. اگر تجربۀ کار کردن با کنسول اپلیکیشن ها را داشته باشید می دانید که منظور از نقطۀ ورود و یا اصطلاحاً Entry Point همان متد public static void Main() از کلاس Program است.

در وب اپلیکیشن هایی که با ASP.NET Core نوشته شده اند ما در این متد از کلاس Program اقدام به ایجاد کردن یک میزبان و یا Host برای وب اپلیکیشن می کنیم. نکتۀ مهم دیگر اینکه روال ایجاد کردن یک Host برای برنامه در ASP.NET Core 1.x متفاوت از ASP.NET Core 2.x است. بنابراین قصد داریم در ابتدا در رابطه با روال ساختن یک میزبان و کلاس Program در ASP.NET Core 1.x صحبت کنیم و پس از آن در رابطه با همین موضوع در ASP.NET Core 2.x صحبت کنیم.

راه اندازی Host در ASP.NET Core 1.0

کدی که در قسمت زیر مشاهده می کنید محتوای یک فایل معمول Program.cs در ASP.NET Core 1.0 را نشان می دهد.

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;

namespace MyFirstCoreApp
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var host = new WebHostBuilder()
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseStartup<Startup>()
                .Build();

            host.Run();
        }
    }
}

بر اساس کد بالا می توان به این نتیجه رسید که هر وب اپلیکیشنی که توسط ASP.NET Core ساخته می شود نیاز به یک میزبان و یا Host دارد تا بتواند اجرا بشود. در متد Main که در قسمت بالا مشاهده کردید ما یک Web Hosting Environment و یا همان محیط میزبانی وب را برای وب اپلیکیشن مان پیکر بندی کرده ایم. یک Host و یا میزبان باید اینترفیس IWebHost را پیاده سازی کند. حال بیایید نگاهی به این روال بصورت دقیق تر بیندازیم.

بسته ی آموزش ویدئویی ساخت وب اپلیکیشن با ASP.NET Core و React

از شما دعوت می کنیم که از بسته ی آموزش ویدئویی ساخت وب اپلیکیشن با ASP.NET Core و React دیدن کنید.

در ابتدا دستور var host = new WebHostBuilder() اجرا می شود. کلاس WebHostBuilder یک Helper Class است که به منظور ساختن و پیکر بندی کردن یک Host برای وب اپلیکیشن مورد استفاده قرار می گیرد. بنابراین اولین کاری که باید انجام بدهیم ایجاد کردن یک Object از این کلاس است. نکتۀ مهم اینکه کلاس WebHostBuilder بخشی از .NET Core API می باشد. اما می توانیم خودمان نیز اقدام به ساختن یک Helper Class کنیم. این موضوع با پیاده سازی اینترفیس IWebHostBuilder انجام می شود. در رابطه با اینترفیس ها توصیه می کنیم که از بسته ی آموزش ویدئویی اینترفیس ها در سی شارپ استفاده کنید. به هرحال دستور بعدی که اجرا می شود UseKestrel است. متد UseKestrel یک Extension Method است که Kestrel را به عنوان یک وب سرور درونی و یا Internal Web Server تنظیم می کند. در حال حاضر Kestrel یک وب سرور Cross-platform و Open-source برای ASP.NET Core است. این وب سرور به منظور استفاده کردن به همراه پروکسی تعریف شده است چرا که در حال حاضر به عنوان یک وب سرور کامل که بتواند بصورت مستقل کار کند شناخته نمی شود.

همانطور که در قسمتهای قبلی نیز گفتیم وب اپلیکیشن هایی که با ASP.NET Core نوشته می شوند کاملاً Cross-platform هستند بنابراین می توانند با هر وب سروری کار کنند و لزوماً مجبور نیستند که با IIS کار کنند.  با این حساب یک وب سرور خارجی و یا اصطلاحاً External Web Server از قبیل IIS و یا Apache و Nginx به منظور ارسال کردن Http Request ها به وب سرور درونی Kestrel مورد استفاده قرار خواهند گرفت.

دستور UseContentRoot()

با استفاده از متد UseContentRoot می توانیم فولدر جاری و یا همان Current Directory را به عنوان فولدر ریشه و یا Root Directory تنظیم کنیم. در واقع این فولدر همان فولدر src در درون پروژه های ASP.NET Core است. فولدر ContentRoot مشخص کنندۀ مکان فایلهای محتوی از قبیل View ها، CSS ها و عکسها می باشند.

دستور UseIISIntegration()

با استفاده از این دستور IIS به عنوان وب سرور خارجی و یا همان External Web Server و یا Reverse Proxy Server تنظیم می شود.

دستور UseStartup

با استفاده از دستور UseStartup می توانیم کلاس Startup که توسط Web Host مورد استفاده قرار می گیرد را تنظیم کنیم. بطور پیش فرض Visual Studio در زمان ساختن یک پروژه با ASP.NET Core یک فایل با نام Startup.cs را ایجاد می کند که حاوی کلاس Startup است. کلاس Startup شبیه به فایل Global.asax است که در درون پروژه های ASP.NET وجود داشتند. با استفاده از این فایل می توان Request Pipeline و یا همان Middleware را پیکربندی کرد.

بسته ی آموزش ویدئویی ساخت وب اپلیکیشن Full-stack با Angular و ASP.NET Core و EF Core

از شما دعوت می کنیم که از بسته ی آموزش ویدئویی ساخت وب اپلیکیشن Full-stack با Angular و ASP.NET Core و EF Core دیدن کنید.

دقت کنید که مجبور نیستیم نام این کلاس را لزوماً Startup بگذاریم. به عبارت دیگر این کلاس می تواند هر نام دیگری داشته باشد. فقط باید نام این کلاس را به عنوان پارامتر جنریک متد UseStartup تنظیم کنیم. در رابطه با این کلاس در قسمتهای بعدی بیشتر صحبت خواهیم کرد.

متد Build()

نهایتاً متد Build() نیز یک Object از نوع IWebHost را که با استفاده از پیکربندی های مشخص شده ایجاد می شود را Return می کند. پس تا اینجای کار توانسته ایم محیط میزبانی و یا Hosting Environment را ایجاد کنیم و هم اکنون زمان اجرا کردن برنامه است.

متد host.Run()

با استفاده از متد Run می توانیم Web Application را Start بزنیم. این موضوع باعث می شود که اپلیکیشن Command Line ما تبدیل به یک Web Application بشود. امیدوارم این موضوع را درک کرده باشید که یک اپلیکیشن در ASP.NET Core با استفاده از متد Main() آغاز به کار می کند. این متد در کلاس Program تعریف شده است و پس از ساخته شدن محیط میزبانی وب اپلیکیشن کار خود را آغاز می کند.

راه اندازی Host در ASP.NET Core 2.x

کدی که در قسمت زیر مشاهده می کنید محتوای کلای Program را در ASP.NET Core 2.x نشان می دهد.

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;

namespace MyFirstCoreApp
{
    public class Program
    {
        public static void Main(string[] args)
        {
            BuildWebHost(args).Run();
        }

        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .Build();
    }
}

همانطور که در این کد مشاهده می کنید متد Main() با صدا زدن متد BuildWebHost اقدام به ایجاد کردن یک WebHost با یکسری پیکربندی های پیش فرض می کند. دقت کنید که متد BuildWebHost بصورت Expression نوشته شده است. می توان این متد را بصورت ساده نوشت. البته باید دقت کنید که خروجی این متد IWebHost است. کد زیر این موضوع را نشان می هد.

public static void Main(string[] args)
{
    BuildWebHost(args).Run();
}

public static IWebHost BuildWebHost(string[] args) 
{
    return WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .Build();
}

حال بیایید نگاه دقیقتری به مراحل ساختن Host بینداریم. کلاس WebHost یک کلاس Static است و می تواند برای ساختن یک Object از نوع IWebHost و IWebHostBuilder و با استفاده از پیکربندی های پیش فرض استفاده بشود.

متد CreateDefaultBuilder() اقدام به ساختن یک Object جدید از نوع WebHostBuilder می کند که در روند ساخت این Object از پیکربندی های پیش فرضی استفاده می شود. بطور درونی این متد پیکربندی هایی از قبیل Kestrel و IISIntegration را تنظیم می کند. کد زیر متد CreateDefaultBuilder() را نشان می دهد. این کد از GitHub گرفته شده است.

public static IWebHostBuilder CreateDefaultBuilder(string[] args)
{
    var builder = new WebHostBuilder()
        .UseKestrel()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .ConfigureAppConfiguration((hostingContext, config) =>
        {
            var env = hostingContext.HostingEnvironment;

            config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);

            if (env.IsDevelopment())
            {
                var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));
                if (appAssembly != null)
                {
                    config.AddUserSecrets(appAssembly, optional: true);
                }
            }

            config.AddEnvironmentVariables();

            if (args != null)
            {
                config.AddCommandLine(args);
            }
        })
        .ConfigureLogging((hostingContext, logging) =>
        {
            logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
            logging.AddConsole();
            logging.AddDebug();
        })
        .UseIISIntegration()
        .UseDefaultServiceProvider((context, options) =>
        {
            options.ValidateScopes = context.HostingEnvironment.IsDevelopment();
        });

    return builder;
}

همانطور که در کد بالا مشاهده می کنید متد CreateDefaultBuilder() اقدام به ایجاد کردن یک Object از نوع WebHostBuilder می کند و پس از آن Kestrel و Content Root Directory و IISIntegration را دقیقاً شبیه به اتفاقی که در متد Main از ASP.NET Core 1.x می افتاد پیکربندی می کند. علاوه بر این، با استفاده از متد ConfigureAppConfiguration() اقدام به بارگذاری پیکربندی هایی از فایل appsettings.json و Environment Variable ها و User Secret ها می کند. علاوه بر این، متد ConfigureLogging() هم مکانیزم Logging به کنسول را و همچنین به پنجره Debug را راه اندازی می کند. پس با استفاده از کلاس Program که در فایل Program.cs در ASP .NET Core 2.x تعریف شده است براحتی می توانیم یک Web Host را راه اندازی کنیم.

بسته ی آموزش ویدئویی ساخت وب اپلیکیشن Full-stack با Angular 2 و ASP.NET Core

از شما دعوت می کنیم که از بسته ی آموزش ویدئویی ساخت وب اپلیکیشن Full-stack با Angular 2 و ASP.NET Core دیدن کنید.

در قسمت بعدی از این آموزش در رابطه با فایل Startup.cs بطور مفصل تری صحبت خواهیم کرد.

امیدواریم که این آموزش از وبسایت پرووید نیز مورد توجه تمامی دوستان عزیز قرار گرفته باشد. از شما دعوت می‌کنیم که از دیگر آموزش های ما در رابطه با فریم ورک ASP.NET Core استفاده کنید. لیست کامل این آموزش ها را می توانید در پست مربوط به آموزش کامل توسعه وب اپلیکیشن با ASP.NET Core مشاهده کنید.

مرتضی گیتی
بدون نظر

ارسال نظر

نظر
نام
ایمیل
وب سایت