إدخال القيم من ملف JSON إلى Controllers

-

بنتعلم في هذا الدرس كيف يمكن استخدام ميزة Dependency Injection من اجل إدخال قيم من ملف JSON إلى controller  أو View. 

ومثل ما بنعمل حتي نفهم الموضوع نبدأ بمثال :

اول اشي نحتاج الى إنشاء ملف JSON على جذر المشروع وقم بتسميته mysettings.json. ثم أضف المحتوى التالي إلى هذا الملف:

{
    "Title": "Dependency Injection Tutorial",
    "Version": 1
}

تمام الان دور نعمل Configure ل التطبيق مشان قراءة الإعدادات من ملف بتنسيق JSON. يمكنك القيام بذلك عن طريق استخدام CreateHostBuilder function  في  Program.cs class .

انتق الى الملف Program.cs  ثم اضف الكود التالي .


using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
namespace StudentsAcademy
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }
        public static IWebHostBuilder CreateHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
               config.AddJsonFile("mysettings.json",
                        optional: false,        // File is not optional.
                        reloadOnChange: false);

            })
            .UseStartup<Startup>();
}
}


استخدمنا function باسم  AddJsonFile هنا حيث تعمل على اضافة ملف JSON إلى IWebHostBuilder.

نحتاج أيضًا إلى إنشاء a class يقوم بتخزين القيم التي تم قراءتها من ملف mysettings.json. لذلك قم بإنشاء ملف class باسم MyJson.cs في مجلد Models وأضف الخصائص التالية إليها.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace StudentsAcademy.Models
{
    public class MyJson
    {
        public string Title { get; set; }
        public int Version { get; set; }
    }
}


واخر خطوة سنقوم بإضافة MyJson.cs class إلى مجموعة Services في Startup.cs class.  للقيام بذلك يجب القيام بثلاثة أشياء في Startup class:

  • إضافة namespace المسماة Microsoft.Extensions.Configuration.
  • اضافة خاصية من النوع IConfiguration وتزويدها بقيمة من خلال DI في constructor of Startup class.
  • اضافة configuration class إلى مجموعة Services .

كود ملف Startup 


using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using StudentsAcademy.Services;
using StudentsAcademy.Middleware;
using StudentsAcademy.Share;
using Microsoft.EntityFrameworkCore;
using StudentsAcademy.Interface;
using StudentsAcademy.Repository;
using StudentsAcademy.Models;
namespace StudentsAcademy
{
    public class Startup
    {
        public IConfiguration Configuration { get; }
        private IWebHostEnvironment env;
        public Startup(IConfiguration configuration, IWebHostEnvironment hostEnv)
        {
            Configuration = configuration;
            env = hostEnv;
        }
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddTransient<ICourses>(provider =>
            {
                if (env.IsDevelopment())
                {
                    var x = provider.GetService<CourseRepository>();
                    return x;
                }
                else
                {
                    return new ClassRoomsRepository();
                }
            });      
            services.Configure<Connections>(Configuration.GetSection("ConnectionStrings"));
            services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
            //services.AddTransient<ICourses, CourseRepository>();
            //services.AddScoped<ICourses, CourseRepository>();
            //services.AddSingleton<ICourses, CourseRepository>();
            services.AddTransient<IStorage, StorageRepository>();
            services.AddTransient<CourseSum>();
            services.AddSingleton<TotalStudents>();
            services.Configure<MyJson>(Configuration);
            services.AddControllersWithViews();
        }
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            //...
        }
    }
}

تمام وبهيك بنكون خلصنا الاعدادات في التطبيق لقراءة القيم من ملف JSON في أي Controller أو View.

الخطوة التالية هي انشاء controller، لذا نضيف controller ونسميه SettingsController.cs. في controller هذه ، نضيف constructor يأخذ parameter من نوع

 IOptions<MyJson> . 

في هذا parameter سيتم قراءة القيم من ملف JSON بواسطة Dependency Injection تلقائيًا. 

الكود لهاذا Controller


using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using StudentsAcademy.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace StudentsAcademy.Controllers
{
    public class SettingsController : Controller
    {
        private readonly MyJson _settings;
        public SettingsController(IOptions<MyJson> settingsOptions)
        {
            _settings = settingsOptions.Value;
        }
        public IActionResult Index()
        {
            ViewData["Title"] = _settings.Title;
            ViewData["Version"] = _settings.Version;
            return View();
        }
    }
}

عرفنا متغير من نوع MyJson (Model class) باسم settings_  ثم في Constructor بنستقبل القيم من ملف JSON باستخدام settingsOptions.Value في هذا المتغير. وبعد هيك أضفنا Index action، وفي هذا action بنعمل على توفير القيم من متغير settings_  إلى متغيري من نوع ViewData. 

الخطوة الأخيرة هي عرض هذه القيم في View 

لذا أضف   viewعن طريق النقر بداخل index يمين ثم اختر Add View، بعد الاضافة بنجاح سيتم إضافة مجلد باسم Settings وفي داخلة View باسم Index


ثم داخل View أضف الكود التالي:

@{
    Layout = null;
}
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Dependency Injection</title>
     <link href="~/lib/bootstrap/dist/css/bootstrap.css" rel="stylesheet" />
</head>
<body class="m-1 p-1">
    @if (ViewData.Count > 0)
    {
        <table class="table table-bordered table-sm table-striped">
            @foreach (var kvp in ViewData)
            {
                <tr><td>@kvp.Key</td><td>@kvp.Value</td></tr>
            }
        </table>
    }
</body>
</html>
سيتم عرض القيم الموجودة في متغيرين ViewData في هذا View.
قم بتشغيل التطبيق بالانتقال الى الرابط 
https://localhost:44382/settings
ستكون نتيجة التنفيذ