إدخال القيم من ملف 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

@{
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>
https://localhost:44382/settings

اترك تعليقك