نحوه تجزیه متغیرهای محیط به DTO در .NET: AWS S3 Bucket مثال

کار با اشیاء همیشه بهتر از رشته های “جادویی” است. داشتن چندین رشته پیکربندی برای برخی از خدمات می تواند برای کار با آن ناراحت کننده باشد. همچنین ، این تعداد پارامترها را برای انتقال به یک سرویس افزایش می دهد. اگر یک پارامتر دیگر را به بخش پیکربندی اضافه کنید ، باید آن را به صورت دستی از پیکربندی بازیابی کرده و آن را به سرویس منتقل کنید ، جایی که از آن استفاده می شود.
درمان تنظیمات پیکربندی به عنوان کلاس DTO باعث می شود کد شما قابل خواندن تر باشد.
پیکربندی را در کلاس DTO تجزیه کنید
به عنوان نمونه ، من یک پیکربندی برای یک سطل AWS S3 در appsettings.json
"AwsS3": {
"AccessKey": "your-access-key",
"SecretKey": "your-secret-key",
"BucketName": "your-bucket-name",
"Region": "us-east-1"
},
بیایید یک کلاس DTO برای آن ایجاد کنیم:
public class AwsS3Settings
{
public string AccessKey { get; set; } = string.Empty;
public string SecretKey { get; set; } = string.Empty;
public string BucketName { get; set; } = string.Empty;
public string Region { get; set; } = string.Empty;
}
اکنون زمان آن رسیده است که ظرف تزریق وابستگی را پیکربندی کنیم تا پیکربندی خود را ذخیره کنیم. این کد بخش پیکربندی را می خواند ، آن را به AwsS3Settings
کلاس ، آن را با IOptions
، و آن را به عنوان یک ظرف اضافه می کند IOptions
بشر
builder.Services.Configure<AwsS3Settings(builder.Configuration.GetSection("AwsS3"));
این بدان معناست که اکنون می توان آن را در برخی از خدمات مانند این تزریق کرد:
public class AwsS3Saver(IOptions<AwsS3Settings> settings
اگر می خواهید پیکربندی خود را مستقیماً تزریق کنید ، بدون IOptions
پوشش ، می توانید آن را به عنوان یک مجرد در ظرف ثبت کنید.
builder.Services.AddSingleton(sp => sp.GetRequiredService<IOptions<AwsS3Settings>>().Value);
سپس ، شما قادر خواهید بود DTO را مستقیماً به هر سرویس تزریق کنید:
public class AwsS3Saver(AwsS3Settings settings)
پیکربندی را به ثبت تبدیل کنید
معمولاً چنین داده هایی با استفاده از یک رکورد درمان می شوند ، نه یک کلاس ساده. با این حال ، از رکورد نمی توان برای ترسیم تنظیمات در آن به همان روش استفاده کرد. اگر سعی کنید ، یک استثنا دریافت خواهید کرد: System.MissingMethodException: Cannot dynamically create an instance of type 'EnvToDtoDemo.Settings.AwsS3SettingsRecord'. Reason: No parameterless constructor defined.
دلیل پشت آن در IOptions
، که به سازنده بدون پارامتر نیاز دارد و set;
برای یک ویژگی عمومی
سوابق از سازندگان با پارامترها استفاده می کنند و از آنها برای اولیه سازی خواص استفاده می کنند ، بنابراین می توان آنها را فقط در حین اولیه سازی تنظیم کرد ، که باعث تغییر آنها می شود.
با این حال ، شما هنوز هم می توانید از سوابق برای تجزیه متغیرهای محیط استفاده کنید ، اما با یک رویکرد کمی متفاوت. استفاده کردن Get
روش فرمت برای نقشه برداری به یک شیء به شدت تایپ شده ، که ماست AwsS3SettingsRecord
بشر پس از آن ، آن را به ظرف اضافه کنید.
public record AwsS3SettingsRecord(string AccessKey, string SecretKey, string BucketName, string Region);
var awsS3SettingsRecord = builder.Configuration.GetSection("AwsS3").Get<AwsS3SettingsRecord>()
?? throw new InvalidOperationException("AwsS3 settings are missing!");
builder.Services.AddSingleton(awsS3SettingsRecord);
همین است! اکنون می توانید در صورت لزوم رکورد را با پیکربندی تزریق کنید.
🖖 از برنامه نویسی خود لذت ببرید!