مدیریت فایلهای تنظیمات در برنامههای NET.: راهکاری برای کار تیمی و محیطهای مختلف
نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۸/۱۱ ۱۰:۳۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
appsettings.json نقش کلیدی را در مدیریت رفتار برنامه در محیطهای مختلف ایفا میکنند. این فایلها به ما اجازه میدهند تا پیکربندیهایی مانند رشتههای اتصال به پایگاه داده یا تنظیمات سرور را بدون تغییر کد اصلی، سفارشی کنیم. اما وقتی پای کار تیمی به میان میآید، چالشهایی مانند هماهنگی تنظیمات محلی هر توسعهدهنده یا شبیهسازی محیطهای staging و production در حین توسعه پیش میآید. در این مقاله، به بررسی این مسائل میپردازیم و راهکارهایی عملی ارائه میدهیم تا کار شما روانتر شود. هدف این است که بتوانید بدون دردسر، برنامهتان را در محیطهای مختلف تست کنید و در تیم، از تداخل تنظیمات جلوگیری کنید.dotnet run اجرا میکنید، محیط به Development تنظیم میشود. اما اغلب نیاز دارید رفتار برنامه را در محیطهای staging (برای تست) یا production (برای تولید) شبیهسازی کنید، بدون اینکه برنامه را مستقر کنید. این کار برای بررسی تنظیمات خاص هر محیط ضروری است، مانند رنگهای رابط کاربری یا اتصالات متفاوت.appsettings.Development.json ذخیره کنید، هر بار که کسی تغییری میدهد، این فایل در Git بهروزرسانی میشود و توسعهدهندگان دیگر مجبور به اصلاح مداوم آن میشوند. این چرخه “گربه و موش” نهتنها وقتگیر است، بلکه خطر فراموش کردن تغییرات در زمان استقرار را افزایش میدهد؛ مثلاً استفاده از تنظیمات توسعه در تولید، که میتواند به مشکلات امنیتی یا عملکردی منجر شود. فراموش کردن بهروزرسانی تنظیمات میتواند عواقب جدی داشته باشد، مانند اتصال به پایگاه داده تولید از محیط توسعه، که دادههای واقعی را در معرض خطر قرار میدهد. همچنین، در تیمهای بزرگ، عدم نسخهبندی تنظیمات محلی میتواند به عدم هماهنگی منجر شود، جایی که تنظیمات یک نفر با دیگری تداخل دارد.appsettings.json بهعنوان پایه و فایلهای محیطی مانند appsettings.Development.json بود. .NET بهطور خودکار فایل مناسب را بر اساس محیط بارگذاری میکند و تنظیمات محیطی بر تنظیمات پایه اولویت دارند.ConnectionStrings را تعریف میکنید:public class ConnectionStrings
{
public string DatabaseConnectionString { get; set; }
public string RedisConnectionString { get; set; }
}appsettings.json تنظیمات پایه (معمولاً برای تولید) را قرار میدهید:{
"ConnectionStrings": {
"DatabaseConnectionString": "data source=SMEAGOL",
"RedisConnectionString": "ARAGORN"
}
}appsettings.Development.json تنظیمات محلی را override میکنید:{
"ConnectionStrings": {
"DatabaseConnectionString": "data source=FRODO",
"RedisConnectionString": "ARWEN"
}
}builder.Services.AddOptions<ConnectionStrings>()
.Bind(builder.Configuration.GetSection("ConnectionStrings"));appsettings.Development.json را به .gitignore اضافه میکنند تا محلی بماند. اما این کار مزایای منبع کنترل را از دست میدهد؛ نمیتوانید تنظیمات همکاران را ببینید یا تغییرات را ردیابی کنید.--Environment استفاده کنید (توجه: این پارامتر حساس به حروف بزرگ و کوچک است و مستندات فعلی ممکن است اشتباه --environment را پیشنهاد کنند).appsettings.Staging.json دارید:{
"SystemSettings": {
"ForegroundColour": "Cyan",
"BackgroundColour": "FireRed"
}
}dotnet run --Environment Staging اجرا کنید. .NET فایل مربوطه را بارگذاری میکند.if (builder.Environment.IsDevelopment())
{
builder.Configuration.AddJsonFile($"appsettings.{Environment.MachineName}.json", optional: true);
}appsettings.{MachineName}.json ایجاد کند (مثلاً appsettings.Ciara.json اگر نام ماشین Ciara باشد):{
"ConnectionStrings": {
"DatabaseConnectionString": "data source=BOMBADIL",
"RedisConnectionString": "MERIADOC"
}
}optional: false برای اجبار ایجاد فایل):if (builder.Environment.IsDevelopment())
{
builder.Configuration.AddJsonFile($"appsettings.{Environment.MachineName}.json", optional: false);
}using Microsoft.Extensions.Options;
var builder = WebApplication.CreateBuilder(args);
if (builder.Environment.IsDevelopment())
{
builder.Configuration.AddJsonFile($"appsettings.{Environment.MachineName}.json", optional: false);
}
builder.Services.AddOptions<ConnectionStrings>()
.Bind(builder.Configuration.GetSection("ConnectionStrings"));
var app = builder.Build();
app.MapGet("/", (IOptions<ConnectionStrings> options) =>
{
var settings = options.Value;
return new
{
Database = settings.DatabaseConnectionString,
Redis = settings.RedisConnectionString
};
});
app.Run();secrets.json (از طریق User Secrets) ذخیره کنید، که بهطور خودکار به .gitignore اضافه میشود. این روش با راهکار ما سازگار است و لایه حفاظتی اضافه میکند.