دات نت در لینوکس: نه فقط یک ترفند بازاریابی


توسعه راه حل های دات نت در لینوکس همیشه چالش برانگیز بوده است زیرا ویژوال استودیو مایکروسافت برای کار کردن به ویندوز نیاز دارد. پس از کار بر روی چندین پروژه دات نت، تصمیم گرفتم محدودیت های توسعه دات نت را در لینوکس آزمایش کنم. این آموزش ساده بر روی یک برنامه ASP.NET MVC با SQL Server تمرکز می کند تا نشان دهد که توسعه دات نت چقدر می تواند در سیستم عامل مورد نظر من زیبا و موثر باشد.

محیط توسعه

اول، ما باید مطمئن شویم که ابزارهای دات نت و SDK مرتبط با ویژگی خاص لینوکس ما با استفاده از نصب شده اند. راهنمای استاندارد مایکروسافت.

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

اطمینان حاصل کنید که این ابزارها به درستی نصب شده اند، قبل از اینکه برنامه نمونه ما را ادامه دهید.

داربست پروژه

در این نمونه برنامه، توسعه و عملکرد ASP.NET را از طریق یک سری موارد استفاده برای یک سیستم مدیریت موجودی فروشگاه کفش فرضی برجسته خواهیم کرد. مانند هر برنامه جدید دات نت، ما باید یک راه حل ایجاد کنیم و سپس یک پروژه به آن اضافه کنیم. ما می‌توانیم از ابزارهای NET SDK CLI برای ایجاد داربست راه‌حل جدیدمان استفاده کنیم:

mkdir Shoestore && cd Shoestore
dotnet new sln

در مرحله بعد، یک پروژه ASP.NET حاوی یک کلاس اصلی صریح برای سادگی ایجاد کنید، زیرا این ساختار پروژه برای توسعه دهندگان ASP.NET بیشتر آشناست. بیایید پروژه خود را با استفاده از الگوی MVC:

mkdir Shoestore.mvc && cd Shoestore.mvc
dotnet new mvc --use-program-main=true

بعد، پروژه را به راه حل اضافه کنید:

# Go to the root of the solution
cd ..
dotnet sln add Shoestore.mvc/

ما اکنون یک راه حل پیش فرض و پروژه ASP.NET حاوی آن داریم. قبل از ادامه، مطمئن شوید که همه چیز ساخته شده است:

cd Shoestore.mvc/
dotnet restore
dotnet build

عملکرد خوب توسعه، قرار دادن سرویس‌های کلیدی و زمان اجرا برنامه را در کانتینرهای Docker برای بهبود استقرار و قابلیت حمل تشویق می‌کند. بنابراین، بیایید یک ظرف Docker ساده برای پشتیبانی از برنامه خود ایجاد کنیم.

قابلیت حمل برنامه

تصاویر Docker معمولاً به یک تصویر والد دیگر Docker به عنوان نقطه شروع پذیرفته شده برای الزامات ضروری مانند سیستم عامل و راه حل های اساسی، از جمله پایگاه داده ها اشاره می کنند. با پیروی از بهترین روش Docker، هر دو a را ایجاد کنید Dockerfile و الف Docker Compose هنگام ارجاع به تصاویر والد منتشر شده توسط مایکروسافت، برای پیکربندی مناسب سرویس فایل کنید. استفاده خواهیم کرد مراحل داکر تا تصویرمان کوچک بماند مراحل به ما این امکان را می دهد که از NET SDK در حین ساخت برنامه خود استفاده کنیم به طوری که زمان اجرا ASP.NET فقط در زمانی که برنامه ما اجرا می شود مورد نیاز است.

ایجاد کنید Shoestore.mvc Dockerfile با محتویات زیر:

# Shoestore\Shoestore.mvc\Dockerfile
# Build stage
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /shoestore
COPY Shoestore.mvc/*.csproj ./
# Restore project packages
RUN dotnet restore
COPY Shoestore.mvc/* ./
# Create a release build
RUN dotnet build -c Release -o /app/build

# Run the application and make it available on port 80
FROM mcr.microsoft.com/dotnet/aspnet:6.0
WORKDIR /app
EXPOSE 80
# Assets and views
COPY Shoestore.mvc/Views ./Views
COPY Shoestore.mvc/wwwroot ./wwwroot
COPY --from=build /app/build ./
ENTRYPOINT [ "dotnet", "Shoestore.mvc.dll" ]

بعد، ما ایجاد می کنیم docker-compose.yml فایل در دایرکتوری ریشه راه حل ما. در ابتدا، فقط حاوی ارجاع به خدمات برنامه ما خواهد بود .Dockerfile:

# Shoestore/docker-compose.yml
version: "3.9"
services:
  web:
    build:
      context: .
      dockerfile: Shoestore.mvc/Dockerfile
    ports:
      - "8080:80"

بیایید محیط خود را نیز با a پیکربندی کنیم فایل .dockerignore برای اطمینان از اینکه فقط مصنوعات ساختنی در تصویر ما کپی می شوند.

با توجه به اینکه سرویس برنامه ما اکنون وارد شده است و محیط اجرای آن آماده اجرا است، باید سرویس پایگاه داده خود را ایجاد کرده و آن را به پیکربندی Docker خود متصل کنیم.

سرویس پایگاه داده

افزودن Microsoft SQL Server به پیکربندی Docker ساده است، به خصوص که ما از یک تصویر Docker ارائه شده توسط مایکروسافت بدون تغییر آن استفاده می کنیم. بلوک تنظیمات زیر را به پایین اضافه کنید docker-compose.yml فایل برای پیکربندی پایگاه داده:

  db:
    image: "mcr.microsoft.com/mssql/server"
    environment:
      SA_PASSWORD: "custom_password_123"
      ACCEPT_EULA: "Y"
    ports:
      - "1433:1433"

اینجا، ACCEPT_EULA از توقف نصب و راه اندازی جلوگیری می کند ports تنظیمات به پورت پیش‌فرض SQL Server بدون ترجمه اجازه عبور می‌دهد. با آن، فایل Compose ما شامل سرویس برنامه و پایگاه داده ما می شود.

قبل از سفارشی کردن کد برنامه، اجازه دهید بررسی کنیم که محیط Docker ما کار می کند:

# From the root of the solution
docker compose up --build

با فرض اینکه هیچ خطایی در هنگام راه اندازی ظاهر نشود، نمونه برنامه ناقص ما باید از طریق یک مرورگر وب در آدرس محلی در دسترس باشد. http://localhost:8080.

اکنون می‌خواهیم روی بخش سرگرم‌کننده تمرکز کنیم: سفارشی‌سازی کد برنامه و اطمینان از ماندگاری داده‌های برنامه در پایگاه داده مایکروسافت SQL Server. ما از هر دو استفاده خواهیم کرد چارچوب نهاد (EF) و ابزارهای NET SDK برای اتصال برنامه به پایگاه داده و داربست مدل، نمای، کنترلر و پیکربندی مورد نیاز برنامه EF.

قبل از اینکه بتوانیم ابزار مورد نیاز خود را مشخص کنیم، باید a ایجاد کنیم tool-manifest فایل:

# From the root of the solution

dotnet new tool-manifest

ابزارهای EF و SDK را با این دستورات ساده به این فایل اضافه کنید:

dotnet tool install dotnet-ef
dotnet tool install dotnet-aspnet-codegenerator

برای تأیید نصب صحیح این ابزارها، اجرا کنید dotnet ef. اگر یک تک شاخ ظاهر شود، آنها به درستی نصب شده اند. بعد، اجرا کنید dotnet aspnet-codegenerator برای تست ابزارهای ASP.NET؛ خروجی باید یک بلوک استفاده کلی از CLI باشد.

اکنون می توانیم از این ابزارها برای ایجاد اپلیکیشن خود استفاده کنیم.

MVC: مدل

اولین وظیفه در ساخت برنامه ما ایجاد مدل است. از آنجایی که این مدل بعداً به پایگاه داده اضافه می شود، ما بسته های MS SQL Server و EF را در پروژه خود قرار خواهیم داد:

cd Shoestore.mvc/
dotnet add package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Tools
dotnet restore

در مرحله بعد، یک آبجکت زمینه پایگاه داده EF ایجاد کنید که تعیین می کند کدام مدل ها به پایگاه داده اضافه می شوند و به کد ما اجازه می دهد به راحتی به آن داده ها از پایگاه داده دسترسی پیدا کند و از آنها درخواست کند.

ایجاد یک Data دایرکتوری برای قرار دادن کد خاص EF و ایجاد آن ApplicationDBContext.cs فایل با محتوای زیر:

// Shoestore/Shoestore.mvc/Data/ApplicationDBContext.cs
using Microsoft.EntityFrameworkCore;

namespace Shoestore.mvc.Data;

public class ApplicationDBContext : DbContext
{
  public ApplicationDBContext(DbContextOptions<ApplicationDBContext> options):base(options){}
}

در مرحله بعد، رشته اتصال پایگاه داده را پیکربندی کنید، که باید با اعتباری که ما در خود پیکربندی کرده ایم مطابقت داشته باشد Dockerfile. محتویات را تنظیم کنید Shoestore/Shoestore.mvc/appsettings.json به موارد زیر:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "Shoestore": "Server=db;Database=master;User=sa;Password=custom_password_123;"
  }
}

با پیکربندی رشته اتصال پایگاه داده و کدگذاری زمینه پایگاه داده، ما آماده کدگذاری برنامه خود هستیم Main عملکرد. شامل خواهیم شد مدیریت استثنا پایگاه داده برای ساده کردن اشکال زدایی سیستم علاوه بر این، از آنجایی که یک اشکال دات نت در کد تولید شده باعث می شود ظرف Docker به اشتباه نماهای ما را ارائه دهد، باید کد خاصی را به پیکربندی سرویس view خود اضافه کنیم. این به صراحت مسیرهای فایل را به مکان مشاهده ما در تصویر داکر ما تنظیم می کند:

using Microsoft.EntityFrameworkCore;
using Shoestore.mvc.Data;

namespace Shoestore.mvc;

// ...

    public static void Main(string[] args)
    {
        var builder = WebApplication.CreateBuilder(args);
        // Associate our EF database context and configure it with our connection string
        var connectionString = builder.Configuration.GetConnectionString("Shoestore");
        builder.Services.AddDbContext<ApplicationDBContext>(
            options => options.UseSqlServer(connectionString));
        // Middleware to catch unhandled exceptions and display a stack trace
        builder.Services.AddDatabaseDeveloperPageExceptionFilter();

        // Add services to the container.
        // ASP.NET has a known issue where the final built app doesn't know where the view
        // files are (in the Docker container). 
        // The fix is to specifically add view locations.
        builder.Services
            .AddControllersWithViews()
            .AddRazorOptions(options => {
                options.ViewLocationFormats.Add("/{1}/{0}.cshtml");
                options.ViewLocationFormats.Add("/Shared/{0}.cshtml");
            });

به پایین پرش کنید IsDevelopment if بیانیه ای در همان فایل برای اضافه کردن یک نقطه پایانی انتقال پایگاه داده به سیستم ما زمانی که در حالت توسعه است. یک را اضافه کنید else بیانیه با کد زیر:

        // Configure the HTTP request pipeline.
        if (!app.Environment.IsDevelopment())
        {
            // Leave the contents of the if block alone. These are hidden for clarity.
        } else {
            app.UseMigrationsEndPoint();
        }

در مرحله بعد، یک آزمایش سریع اجرا کنید تا مطمئن شوید که بسته های جدید و ویرایش های کد منبع به درستی کامپایل شده اند:

// Go to mvc directory
cd Shoestore.mvc
dotnet restore
dotnet build

حال، بیایید با ایجاد آن، مدل را با فیلدهای مورد نیاز خود پر کنیم Shoestore.mvc\Models\Shoe.cs فایل:

namespace Shoestore.mvc.Models;

public class Shoe {
    public int ID { get; set; }
    public string? Name { get; set; }
    public int? Price { get; set; }
    public DateTime CreatedDate { get; set; }
}

EF SQL را بر اساس مدل مرتبط، فایل زمینه آن و هر کد EF در برنامه ما تولید می کند. سپس نتایج SQL ترجمه شده و در صورت لزوم به کد ما بازگردانده می شود. اگر ما اضافه کنیم Shoe EF می‌داند که چگونه بین MS SQL Server و برنامه‌مان ترجمه کند. بیایید این کار را در فایل زمینه پایگاه داده انجام دهیم، Shoestore/Shoestore.mvc/Data/ApplicationDBContext.cs:

using Microsoft.EntityFrameworkCore;
using Shoestore.mvc.Models;

namespace Shoestore.mvc.Data;

public class ApplicationDBContext : DbContext
{
  public ApplicationDBContext(DbContextOptions<ApplicationDBContext> options) : base(options) { }

    private DbSet<Shoe>? _shoe { get; set; }
    public DbSet<Shoe> Shoe {
        set => _shoe = value;
        get => _shoe ?? throw new InvalidOperationException("Uninitialized property" + nameof(Shoe));
    }
}

در نهایت، ما از یک فایل انتقال پایگاه داده برای وارد کردن مدل خود به پایگاه داده استفاده می کنیم. ابزار EF یک فایل مهاجرتی مخصوص MS SQL Server را بر اساس زمینه پایگاه داده و مدل مرتبط با آن ایجاد می کند (به عنوان مثال، Shoe):

cd Shoestore.mvc/
dotnet ef migrations add InitialCreate

اجازه دهید تا زمانی که یک کنترلر و نمای در محل خود داشته باشیم، مهاجرت خود را اجرا نکنیم.

MVC: کنترلر و نمایش

ما کنترلر خود را با استفاده از ابزار تولید کد ASP.NET ایجاد می کنیم. این ابزار بسیار قدرتمند است اما به کلاس های کمکی خاصی نیاز دارد. استفاده کنید Design بسته های سبک برای ساختار اصلی کنترلر و ادغام EF آن. بیایید این بسته ها را اضافه کنیم:

cd Shoestore.mvc\
dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design && \
dotnet add package Microsoft.EntityFrameworkCore.Design && \
dotnet restore

اکنون، ایجاد کنترلر پیش فرض ما به سادگی فراخوانی دستور زیر است:

cd Shoestore.mvc\
dotnet dotnet-aspnet-codegenerator controller \
        -name ShoesController \
        -m Shoe \
        -dc ApplicationDBContext \
        --relativeFolderPath Controllers \
        --useDefaultLayout \
        --referenceScriptLibraries

هنگامی که مولد کد کنترل کننده ما را ایجاد می کند، یک نمای ساده برای آن کنترلر نیز ایجاد می کند. با تکمیل پایه های MVC، ما آماده هستیم تا همه چیز را اجرا کنیم.

آزمون مهاجرت و درخواست

مهاجرت های EF معمولاً یک امر ساده است، اما زمانی که داکر درگیر است، فرآیند پیچیده تر می شود. در مقاله بعدی مجموعه ما، مسیر فوق‌العاده پر پیچ و خم برای انجام این مهاجرت‌ها در راه‌حل Docker را بررسی می‌کنیم، اما در حال حاضر، ما فقط می‌خواهیم مهاجرت ما اجرا شود.

تمام فایل های پیکربندی و مهاجرت در مخزن ما گنجانده شده است. بیایید پروژه کامل را در ماشین محلی خود کلون کنیم و انتقال را انجام دهیم:

git clone 
cd ./dot-net-on-linux
docker composer up

را docker composer عملیات برنامه ما را می سازد، مهاجرت را اجرا می کند و برنامه ASP.NET ما را با زمان اجرا دات نت راه اندازی می کند. برای دسترسی به راه حل در حال اجرا، مراجعه کنید http://localhost:8080/Shoes.

اگرچه رابط برنامه ما ساده است، اما عملکرد را در تمام سطوح، از نمای پایین گرفته تا پایگاه داده نشان می دهد.

دات نت در لینوکس فقط کار می کند

را ببینید مخزن کامل برای یک مرور کلی از راه حل ما مقاله بعدی مهاجرت ما را با جزئیات و همچنین نکات و ترفندهایی برای نازک کردن تصاویر Docker پوشش خواهد داد.

دات نت در لینوکس چیزی بیش از یک رویا ساده است: این یک زبان، زمان اجرا و ترکیب سیستم عامل است. بسیاری از توسعه دهندگانی که در ویژوال استودیو رشد کرده اند ممکن است تجربه استفاده از دات نت CLI را نداشته باشند، اما این ابزارها موثر و قدرتمند هستند.

ادامه مطلب در وبلاگ مهندسی تاپتال:

وبلاگ مهندسی Toptal از Henok Tsegaye برای بررسی نمونه کدهای ارائه شده در این مقاله تشکر می کند.



منبع

Matthew Newman

Matthew Newman Matthew has over 15 years of experience in database management and software development, with a strong focus on full-stack web applications. He specializes in Django and Vue.js with expertise deploying to both server and serverless environments on AWS. He also works with relational databases and large datasets
[ Back To Top ]