سه شنبه , ۲۵ تیر ۱۳۹۸
خانه - #C - آشنایی با Application startup در ASP.NET Core 2
The-Joel-Test

آشنایی با Application startup در ASP.NET Core 2

وظیفه کلاس StartUp پیکربندی سرویس های برنامه و مشخص کردن نحوه پردازش درخواست ها در خط لوله (pipeline) می باشد.

کلاس Startup

به طور کلی در این کلاس شامل ۲ بخش زیر است:

  • میتوان سرویس های مورد نیاز برنامه را در ConfigureServices تزریق کرد (DI)
  • یک متد اجباری به نام Configure که وظیفه مشخص نمودن pipeline و درخواست هایی به آن وارد می شوند را دارد.

 

این دو متد در زمان اجرا هنگامی که برنامه شروع به کار می کند فراخوانی می شوند.

public class Startup
{
    // Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        ...
    }

    // Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app)
    {
        ...
    }
}

 

در سازنده کلاس Startup دوتا وابستگی به وسیله DI تزریق شده است:

  • IHostingEnvironment  برای پیکر بندی سرویس ها و تنظیمات بر اساس محیط توسعه
  • IConfiguration برای پیکربندی تنظیمات سیستم در هنگام اجرای برنامه

 

public class Startup
{
    public Startup(IHostingEnvironment env, IConfiguration config)
    {
        HostingEnvironment = env;
        Configuration = config;
    }

    public IHostingEnvironment HostingEnvironment { get; }
    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        if (HostingEnvironment.IsDevelopment())
        {
            // Development configuration
        }
        else
        {
            // Staging/Production configuration
        }

        // Configuration is available during startup. Examples:
        // Configuration["key"]
        // Configuration["subsection:suboption1"]
    }
}

برنامه می تواند کلاس های راه اندازی جداگانه برای محیط های مختلف (به عنوان مثال، StartupDevelopment) را تعریف کند و کلاس مناسب را در زمان اجرا بر اساس محیط توسعه انتخاب می کند. اگر برنامه در محیطی توسعه اجرا شود که شامل هر دو کلاس راه اندازی یعنی یک کلاس StartupDevelopment و کلاس StartupDevelopment باشد. کلاسی که نام پسوند آن با محیط فعلی مطابقت دارد در اولویت قرار می گیرد.

 

متد ConfigureServices

این متد، یک متد :

  • کاملا اختیاری است.
  • توسط وب هاست قبل از configure برای پیکربندی سرویس های اپلیکیشن فراخوانی می شود.
  • جایی است که در آن می توان مشخص کرد چه تنظماتی یا فایل پیکربندی برای برنامه انتخاب می شود.

 

با اضافه کردن سرویس ها در این متد باعث می شود که این سرویس یا کلاس در تمامی برنامه به خاطر DI در دسترس باشد.این عملیات یا به وسیله تزریق وابستگی ها و یا IApplicationBuilder.ApplicationServices انجام می شود.

خوب وب هاست هم ممکن است قبل از صدا زدن کلاس Startup خودش یک سری از سرویس ها را پیکر بندی کند.برای اطلاعات بیشتر می توانید به پیج Hosting  بروید.

برای ویژگی هایی که نیاز به تنظیم قابل توجهی دارند، روش افزودن [Service] را در IServiceCollection وجود دارد. یک برنامه وب معمولی سرویسهای Entity Framework، Identity و MVC را لازم دارد .

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddIdentity<ApplicationUser, IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    services.AddMvc();

    // Add application services.
    services.AddTransient<IEmailSender, AuthMessageSender>();
    services.AddTransient<ISmsSender, AuthMessageSender>();
}

 

سرویس های قابل دسترس در Startup

وب هاست یک سری از سرویس ها را فراهم می کند که به وسیله DI در سازنده کلاس Startup در دسترس هستند. بعد از آن اپلیکیشن (IApplicationBuilder) نیز در متد ConfigureServices بقیه سرویس ها را اضافه می کند. و در نهایت این سرویس ها در متد Configure  و سایر نقاط اپلیکیشن در دسترس خواهند بود.

 

متد Configure

در این متد نحوه رفتار با درخواست هایی که وارد برنامه می شوند مشخص می شود. این عملیات با استفاده از تعریف و اضافه کردن میان افزارهایی به IApplicationBuilder صورت میگیرد که در نهایت pipeline یا خط لوله ما را می سازد. اگر برای شما این سوال پیش آمده باشد که IApplicationBuilder چگونه در این متد در دسترس است در حالی که سرویس آن ثبت نشده است باید بدانید که IApplicationBuilder در خود وب هاست ساخته می شود و مستقیما به متد Configure پاس داده می شود.

در قطعه کد پایین در متد Configure خط لوله با سرویس های مدریتیت خطاهای زمان توسعه ( developer exception ) ،BrowserLinkبرگه های خطا (Error page) ،مدیریت فایل های ایستا و asp.net mvc کانفیگ شده است.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseBrowserLink();
    }
    else
    {
        app.UseExceptionHandler("/Error");
    }

    app.UseStaticFiles();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller}/{action=Index}/{id?}");
    });
}

در کد  بالا هر بار که از تابع Use استفاده می کنیم یک Middleware به خطلوله درخواست اضافه می شود.به عنوان مثال هنگامی که از UseMVC استفاده می کنیم. routing middleware به pipeLine اضافه می شود .

تنظیمات بالا را می توان در همان فایل Program  نیز انجام داد.

public class Program
{
    public static IHostingEnvironment HostingEnvironment { get; }
    public static IConfiguration Configuration { get; }

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

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                HostingEnvironment = hostingContext.HostingEnvironment;
                Configuration = config.Build();
            })
            .ConfigureServices(services =>
            {
                services.AddMvc();
            })
            .Configure(app =>
            {
                if (HostingEnvironment.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
                else
                {
                    app.UseExceptionHandler("/Error");
                }

                // Configuration is available during startup. Examples:
                // Configuration["key"]
                // Configuration["subsection:suboption1"]

                app.UseMvcWithDefaultRoute();
                app.UseStaticFiles();
            })
            .Build();
}

 

Startup filters

با استفاده از IStartupFilter می توان pipeline را در ابتدا و یا انتهای برنامه پیکربندی (config) کرد. یکی از مزایای استفاده از  IStartupFilter این است که اطمینان حاصل کنیم که میان افزار قبل و یا بعد از میان افزار های اضافه شده به خط لوله (چه در ابتدا و چ در انتها) اجرا می شود یا خیر.

IStartupFilter یک متد را پیاده سازی میکند که ورودی و خروجی آن هر دو از نوع <Action<IApplicationBuilder است.یک  IApplicationBuilder یک کلاس را میسازد که خط لوله را برای درخواست ها پیکر بندی می کند. برای اطلاعات بیشتر به اینجا مراجعه کنید.

منبع

درباره ی محمد لطفی

برنامه نویس و توسعه دهنده .Net هستم. از یادگیری و آموزش لذت می برم. برنامه نویسی رو از دانشگاه شروع کردم و الانم در نیک آموز مهارت های خودم رو توسعه می دم.

همچنین ببینید

ASP.NET-CORE-Routing

مسیریابی در ASP.NET Core

مسیریابی در ASP.NET Core به مکانیسمی گفته می شود که آدرس کامل را از درخواست Http  …

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *