با استفاده از Configuration می توانیم مقادیر مربوط به تنظیمات برنامه را به صورت key-value pairs دریافت کنیم. این تنظیمات می توانند شامل رشته اتصال، Client Credential برای اتصال به API یا … باشد. Configuration به صورت پیشفرض در پروژه های Asp.Net Core در دسترس است. در این مقاله به بررسی نحوه پیاده سازی Configuration در WPF و NET 5. می پردازیم.

در مقاله پیشین به بررسی نحوه “پیاده سازی Dependency Injection در WPF و NET 5.” پرداختیم و این مقاله به نوعی در ادامه مقاله قبلی نگارش شده است. همچنین در این مقاله از سرویس Dependency Injection استفاده شده، پس حتما مقاله قبلی را بخوانید!

سورس کد پروژه : https://github.com/softamoz/WPF.NET5DIAndConfiguration

نصب Nuget پکیج های لازم

اولین و مهم ترین پکیجی که باید نصب شود، Microsoft.Extensions.Configuration است. برای نصب می توانید از Package Manager Console یا پنجره Manage Nuget Packages استفاده کنید.

در شرایط و سناریو های مختلف، لازم است پکیج های دیگری هم نصب کنیم. برای مثال پکیج Microsoft.Extensions.Configuration.Json زمانی لازم است که از Provider مربوط به فایل های JSON استفاده می کنیم. در این مقاله صرفا از فایل appsettings.json استفاده می کنیم. بنابراین نصب این پکیج لازم است. البته خود Microsoft.Extensions.Configuration.Json وابسته به Microsoft.Extensions.Configuration هست پس با نصب Microsoft.Extensions.Configuration.Json پکیج Microsoft.Extensions.Configuration نیز نصب و در دسترس خواهد بود.

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

پیاده سازی Configuration در کلاس App.xaml.cs

حال در کلاس App.xaml.cs یک پراپرتی جدید از نوع IConfiguration ایجاد می کنیم:

public IConfiguration Configuration { get; private set; }

از این پراپرتی برای دسترسی به Configuration از طریق Dependency Injection استفاده خواهیم کرد.

سپس در متد OnStartup در همین کلاس، با استفاده از یک نمونه از کلاس ConfigurationBuilder فرآینده کانفیگ و بیلد Configuration را انجام می دهیم.

//Config Configuration!!!
var builder = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);

//Build Configuration!!!
Configuration = builder.Build();

همانطور که در کد فوق مشاهده می کنید، با استفاده از SetBasePath دایرکتوری فعلی (محل اجرای برنامه) به عنوان Base Path تنظیم شده و با استفاده از AddJsonFile از Provider فایل های JSON استفاده کردیم.

برای مشاهده لیست Provider ها به این لینک یا این لینک مراجعه کنید.

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

اکنون دسترسی به فایل appsettings.json از طریق این پراپرتی فراهم شده است. ولی این پراپرتی فقط در همین کلاس در دسترس است و در سایر کلاس های برنامه در دسترس نیست.

افزودن Configuration به سیستم Dependency Injection

اگر مقاله قبل را مطالعه کرده یا با سیستم Dependency Injection در Net. آشنایی داشته باشید این مرحله بسیار آسان خواهد بود.

کافی است در متد ConfigureServices در کلاس App.xaml.cs که در مقاله قبل ایجاد کردیم، پراپرتی Configuration را به صورت Singleton به سرویس های برنامه اضافه کنیم.

services.AddSingleton(Configuration);

اکنون به این پراپرتی در سایر قسمت های برنامه نیز دسترسی داریم. کافی است از Constructor Injection استفاده کنیم. کد نهایی کلاس App.xaml.cs به این شکل خواهد بود:

using System;
using System.IO;
using System.Windows;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

namespace WPF.NET5DIAndConfiguration
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App
    {
        public IServiceProvider ServiceProvider { get; private set; }

        public IConfiguration Configuration { get; private set; }


        private void App_OnStartup(object sender, StartupEventArgs e)
        {
            //Config Configuration!!!
            var builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);

            //Build Configuration!!!
            Configuration = builder.Build();



            var serviceCollection = new ServiceCollection();

            ConfigureServices(serviceCollection);

            ServiceProvider = serviceCollection.BuildServiceProvider();

            var mainWindow = ServiceProvider.GetRequiredService<MainWindow>();
            mainWindow.Show();
        }

        private void ConfigureServices(IServiceCollection services)
        {
            services.AddTransient<MainWindow>();

            services.AddSingleton(Configuration);
        }
    }
}

استفاده از Configuration در MainWindow

ابتدا در محل پروژه فایل appsettings.json را ایجاد و محتوای زیر را درون آن قرار دهید:

{
  "ConnectionStrings": {
    "Default": "Hello! This is My Connection String!"
  }
}

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

حال در Code Behind فایل MainWindow.xaml یعنی کلاس MainWindow.xaml.cs از طریق Constructor Injection به Configuration دسترسی خواهیم داشت:

        public MainWindow(IConfiguration configuration)
        {
            InitializeComponent();
        }

اگر با Asp.Net Core آشنایی داشته باشید می دانید، متد GetConnectionString از IConfiguration برای دسترسی راحت تر به رشته اتصال در دسترس هست. پس کد فوق را به شکل زیر تغییر می دهیم و رشته اتصال را در یک متغیر ذخیره می کنیم. کد نهایی MainWindow.xaml.cs به شکل زیر خواهد بود:

using System.Windows;
using Microsoft.Extensions.Configuration;

namespace WPF.NET5DIAndConfiguration
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow(IConfiguration configuration)
        {
            InitializeComponent();
            var connectionString = configuration.GetConnectionString("Default");
        }
    }
}

اکنون با استفاده از Break Point و اجرای برنامه در حالت Debug می توانیم اطمینان حاصل کنیم، مقدار رشته اتصال، یعنی “Hello! This is My Connection String” در متغیر ذخیره شده است!

IConfiguration.GetConnectionString

بررسی اکسپشن System.IO.FileNotFoundException

در هنگام کانفیگ JSON Provider ، امکان اختیاری بودن فایل appsettings.json را غیر فعال کردیم. پس اگر این اکسپشن را مشاهده کردید، ممکن است فایل appsettings.json در محل پروژه قرار نگرفته باشد. بخصوص اگر این فایل را با استفاده از Visual Studio ایجاد کرده باشید. برای رفع این مشکل قطعه کد زیر را به فایل csproj اضافه کنید :

<ItemGroup>
    <None Update="appsettings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
</ItemGroup>

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

 

منابع و مطالعه بیشتر

سورس کد پروژه : https://github.com/softamoz/WPF.NET5DIAndConfiguration

منبع تصویر مقاله : https://www.lynda.com/Windows-Server-tutorials/Windows-Server-2016-Installation-Configuration/500545-2.html