برنامه نویسی

سازنده ASP.NET Core DI با پارامترها

Summarize this content to 400 words in Persian Lang

مقدمه

بیشتر نمونه‌های تزریق وابستگی، خدمات بدون پارامتر را ثبت می‌کنند، مانند ارائه شده در زیر برای ثبت یک سرویس ساده. در اینجا درس نحوه ثبت سرویسی است که به دو پارامتر از آن نیاز دارد، در این مورد از یک سرویس ثبت شده دیگر. این سرویس به این دلیل انتخاب شد که نویسنده هیچ دستورالعملی برای ASP.NET Core نداشت و ثانیاً به نظر می رسد یک بسته نیمه محبوب NuGet باشد.

public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

builder.Services.AddScopedIValidatorPerson>, PersonValidator>();
builder.Services.AddFluentValidationAutoValidation();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler(“/Error”);
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

کد منبع

🔸 کد منبع از NET8 Core Framework استفاده می کند

بسته LocalStorage NuGet

LocalStorage قابلیت‌هایی را برای داده‌های ذخیره‌شده در یک فایل فیزیکی فراهم می‌کند که می‌توان آن‌ها را به راحتی ذخیره کرد و به آنها دسترسی پیدا کرد، همراه با پشتیبانی از رمزگذاری داده‌ها به‌علاوه ذخیره اطلاعات برای ساخت سرویس در appsettings.json با اسرار کاربر.

🛡️ قبل از اجرای کد نمونه، باید با کلیک راست روی پروژه، اسرار کاربر را مقداردهی اولیه کنید، مدیریت اسرار کاربر را انتخاب کنید و موارد زیر را کپی/پیست کنید و فایل را ذخیره کنید.

{
“SecretVault”: {
“Key”: “@user_!maple_hiney_cars1”,
“Password”: “^SsD_Ooops_Coffee_tree_d_f_5”,
“Salt”: “50652cbc-cd7b-4763-a833-f2802a26285e”
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای انجام موارد فوق روی پروژه در Solution Explorer کلیک راست کنید.

چیزی که نیست

روش های کار با ذخیره سازی محلی وب

نمونه کار

اطلاعات جمع آوری شده در صفحه فهرست را بگیرید و اطلاعات را در صفحه دیگری بازیابی کنید.

مدل

public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public override string ToString() => $”{Id,-4}{FirstName} {LastName}”;
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مراحل

که قبلا کدگذاری شده اند اما اجازه می دهد در مورد کد صحبت کنیم. LocalStorage کلاسی است که پارامترهایی را می پذیرد که ثبت می شوند.

سازنده LocalStorage به پارامتر اول از نوع LocalStorageConfiguration نیاز دارد که در بسته LocalStorage NuGet موجود است و پارامتر دوم رمز عبور است. اطلاعات/تنظیمات مطابق فایل مخفی بالا از appsettings.json آماده خواهند شد.

از آنجایی که ثبت یک سرویس به یک رابط نیاز دارد موارد زیر مورد نیاز است.

public interface ILocalSetup
{
LocalStorageConfiguration Configuration { get; set; }
string Key { get; init; }
string Password { get; init; }
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

کلاسی که ILocalSetup را پیاده‌سازی می‌کند، یک تک‌تنه است، اگرچه از کلاس غیر تک‌تنه‌ای ممکن است استفاده شود در حالی که تک‌تون ساده‌تر است.

public sealed class LocalSetup : ILocalSetup
{
private static readonly LazyLocalSetup> Lazy = new(() => new LocalSetup());
public static LocalSetup Instance => Lazy.Value;
public LocalStorageConfiguration Configuration { get; set; }
public string Key { get; init; }
public string Password { get; init; }
public static string Salt { get; set; }

public LocalSetup()
{
Key = VaultReader.Key;
Password = VaultReader.Password;
Salt = VaultReader.Salt;

Configuration = GetConfiguration();
}

private static LocalStorageConfiguration GetConfiguration()
=> new() { EnableEncryption = true, EncryptionSalt = Salt };
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

سرویس ILocalSetup را در Program.cs ثبت کنید

builder.Services.AddSingletonILocalSetup, LocalSetup>();

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پس از ثبت نام، زمان ثبت نام ILocalStorage است. ILocalSetup مورد نیاز است که بخش مهمی از فرآیند است.

GetRequiredService برای دریافت ارجاع به سرویس قبلی استفاده می شود.

با استفاده از GetRequiredService، اگر سرویس مورد نیاز پیدا نشود، باعث استثنا در زمان اجرا می شود در حالی که GetService null را برمی گرداند، به این معنی که توسعه دهنده باید null را بررسی کند.

/*
* service to get configuration and password from appsettings.json
* setup with user secrets (Azure is a better option).
*/
builder.Services.AddSingletonILocalSetup, LocalSetup>();

// service to read and write to local storage file
builder.Services.AddScopedILocalStorage>(provider =>
{
var localSetup = provider.GetRequiredServiceILocalSetup>();
return new LocalStorage(localSetup.Configuration, localSetup.Password);
});

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در مورد آخرین بلوک کد، localSetup یک ارجاع به LocalSetup دارد که دارای ویژگی هایی است که به سازنده LocalStorage ارسال می شود.

توجه داشته باشید که بسته LocalStorage نیز بدون عبور پارامترها کار می کند اما داده ها محافظت نمی شوند.

با استفاده از LocalStorage

در کد نمونه، تصویر سمت چپ صفحه ورودی است، سمت راست گیرنده است.

پشتیبان های صفحه سی شارپ

صفحه ورودی/فهرست

متغیر LocalStorageKey گرفته شده از کلاس singleton حاوی کلیدی از appsettings.json برای ارسال به فروشگاه روشی در پست که باید در صفحه گیرنده مطابقت داشته باشد.
قسمت _localStorage در سازنده صفحه تنظیم شده است که در Post برای ذخیره نمونه ای از Person در یک فایل استفاده می شود.

برای حفظ موضوع، هیچ ادعایی وجود ندارد که ببینیم نام و نام خانوادگی خالی نیستند. Person.Id کدگذاری شده است زیرا در این نمونه دلیلی برای افزایش شناسه وجود ندارد.

using Hanssens.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using WorkingWithLocalStorageApp.Classes;
using WorkingWithLocalStorageApp.Models;

namespace WorkingWithLocalStorageApp.Pages;
public class IndexModel : PageModel
{
string LocalStorageKey => LocalSetup.Instance.Key;
private LocalStorage _localStorage;

[BindProperty] public Person Person { get; set; }

public IndexModel(ILocalStorage storage)
=> _localStorage = storage as LocalStorage;

public void OnGet() { }

public RedirectToPageResult OnPostSetLocalToLocalStorage()
{
Person.Id = 1;
_localStorage.Store(LocalStorageKey,Person);
_localStorage.Persist();

return RedirectToPage(“ViewPage”);
}

public void OnPostGetFromLocalStorage()
{
var person = _localStorage.GetPerson>(LocalStorageKey);

Log.Information(“Person: {person}”, person);
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

فایل رمزگذاری شده

صفحه دریافت

از همان کلید صفحه ورودی/ورودی برای خواندن داده های شخص در نمونه جدیدی از ویژگی Person استفاده می کند و نام و نام خانوادگی را در صفحه نمایش می دهد.

public class ViewPageModel : PageModel
{
private LocalStorage _localStorage;

[BindProperty] public Person Person { get; set; }

public ViewPageModel(ILocalStorage storage)
=> _localStorage = storage as LocalStorage;

public void OnGet()
{
Person = _localStorage.GetPerson>(LocalSetup.Instance.Key);
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خلاصه

کدی برای ثبت سرویسی ارائه شده است که سازنده مقادیری از سرویس ثبت شده دیگر را می خواهد. با دنبال کردن این موارد برای قرار گرفتن در جعبه ابزار توسعه‌دهندگان مایکروسافت سی شارپ مفید خواهد بود.

همچنین، کدی برای دریافت و ذخیره اطلاعاتی که می تواند بین جلسات و/یا صفحات به اشتراک گذاشته شود، کد کنید.

مقدمه

بیشتر نمونه‌های تزریق وابستگی، خدمات بدون پارامتر را ثبت می‌کنند، مانند ارائه شده در زیر برای ثبت یک سرویس ساده. در اینجا درس نحوه ثبت سرویسی است که به دو پارامتر از آن نیاز دارد، در این مورد از یک سرویس ثبت شده دیگر. این سرویس به این دلیل انتخاب شد که نویسنده هیچ دستورالعملی برای ASP.NET Core نداشت و ثانیاً به نظر می رسد یک بسته نیمه محبوب NuGet باشد.

public class Program
{
    public static void Main(string[] args)
    {
        var builder = WebApplication.CreateBuilder(args);

        builder.Services.AddRazorPages();

        builder.Services.AddScopedIValidatorPerson>, PersonValidator>();
        builder.Services.AddFluentValidationAutoValidation();

        var app = builder.Build();

        // Configure the HTTP request pipeline.
        if (!app.Environment.IsDevelopment())
        {
            app.UseExceptionHandler("/Error");
            // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthorization();

        app.MapRazorPages();

        app.Run();
    }
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

کد منبع

🔸 کد منبع از NET8 Core Framework استفاده می کند

بسته LocalStorage NuGet

LocalStorage قابلیت‌هایی را برای داده‌های ذخیره‌شده در یک فایل فیزیکی فراهم می‌کند که می‌توان آن‌ها را به راحتی ذخیره کرد و به آنها دسترسی پیدا کرد، همراه با پشتیبانی از رمزگذاری داده‌ها به‌علاوه ذخیره اطلاعات برای ساخت سرویس در appsettings.json با اسرار کاربر.

🛡️ قبل از اجرای کد نمونه، باید با کلیک راست روی پروژه، اسرار کاربر را مقداردهی اولیه کنید، مدیریت اسرار کاربر را انتخاب کنید و موارد زیر را کپی/پیست کنید و فایل را ذخیره کنید.

{
  "SecretVault": {
    "Key": "@user_!maple_hiney_cars1",
    "Password": "^SsD_Ooops_Coffee_tree_d_f_5",
    "Salt": "50652cbc-cd7b-4763-a833-f2802a26285e"
  }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای انجام موارد فوق روی پروژه در Solution Explorer کلیک راست کنید.

اسکرین شات برای دستورالعمل های بالا

چیزی که نیست

روش های کار با ذخیره سازی محلی وب

نمونه کار

اطلاعات جمع آوری شده در صفحه فهرست را بگیرید و اطلاعات را در صفحه دیگری بازیابی کنید.

مدل

public class Person
{
    public int Id { get; set; }
    public string  FirstName { get; set; }
    public string LastName { get; set; }
    public override string ToString() => $"{Id,-4}{FirstName} {LastName}";
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مراحل

که قبلا کدگذاری شده اند اما اجازه می دهد در مورد کد صحبت کنیم. LocalStorage کلاسی است که پارامترهایی را می پذیرد که ثبت می شوند.

سازنده LocalStorage به پارامتر اول از نوع LocalStorageConfiguration نیاز دارد که در بسته LocalStorage NuGet موجود است و پارامتر دوم رمز عبور است. اطلاعات/تنظیمات مطابق فایل مخفی بالا از appsettings.json آماده خواهند شد.

از آنجایی که ثبت یک سرویس به یک رابط نیاز دارد موارد زیر مورد نیاز است.

public interface ILocalSetup
{
    LocalStorageConfiguration Configuration { get; set; }
    string Key { get; init; }
    string Password { get; init; }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

کلاسی که ILocalSetup را پیاده‌سازی می‌کند، یک تک‌تنه است، اگرچه از کلاس غیر تک‌تنه‌ای ممکن است استفاده شود در حالی که تک‌تون ساده‌تر است.

public sealed class LocalSetup : ILocalSetup
{
    private static readonly LazyLocalSetup> Lazy = new(() => new LocalSetup());
    public static LocalSetup Instance => Lazy.Value;
    public LocalStorageConfiguration Configuration { get; set; }
    public string Key { get; init; } 
    public string Password { get; init; }
    public static string Salt { get; set; }

    public LocalSetup()
    {
        Key = VaultReader.Key;
        Password = VaultReader.Password;
        Salt = VaultReader.Salt;

        Configuration = GetConfiguration();
    }

    private static LocalStorageConfiguration GetConfiguration() 
        => new() { EnableEncryption = true, EncryptionSalt = Salt };
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

سرویس ILocalSetup را در Program.cs ثبت کنید

builder.Services.AddSingletonILocalSetup, LocalSetup>();
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پس از ثبت نام، زمان ثبت نام ILocalStorage است. ILocalSetup مورد نیاز است که بخش مهمی از فرآیند است.

GetRequiredService برای دریافت ارجاع به سرویس قبلی استفاده می شود.

با استفاده از GetRequiredService، اگر سرویس مورد نیاز پیدا نشود، باعث استثنا در زمان اجرا می شود در حالی که GetService null را برمی گرداند، به این معنی که توسعه دهنده باید null را بررسی کند.

/*
 * service to get configuration and password from appsettings.json
 * setup with user secrets (Azure is a better option).
 */
builder.Services.AddSingletonILocalSetup, LocalSetup>();

// service to read and write to local storage file
builder.Services.AddScopedILocalStorage>(provider =>
{
    var localSetup = provider.GetRequiredServiceILocalSetup>();
    return new LocalStorage(localSetup.Configuration, localSetup.Password);
});
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در مورد آخرین بلوک کد، localSetup یک ارجاع به LocalSetup دارد که دارای ویژگی هایی است که به سازنده LocalStorage ارسال می شود.

توجه داشته باشید که بسته LocalStorage نیز بدون عبور پارامترها کار می کند اما داده ها محافظت نمی شوند.

با استفاده از LocalStorage

در کد نمونه، تصویر سمت چپ صفحه ورودی است، سمت راست گیرنده است.

اسکرین شات برای صفحات ورودی و گیرنده

پشتیبان های صفحه سی شارپ

صفحه ورودی/فهرست

  • متغیر LocalStorageKey گرفته شده از کلاس singleton حاوی کلیدی از appsettings.json برای ارسال به فروشگاه روشی در پست که باید در صفحه گیرنده مطابقت داشته باشد.
  • قسمت _localStorage در سازنده صفحه تنظیم شده است که در Post برای ذخیره نمونه ای از Person در یک فایل استفاده می شود.

برای حفظ موضوع، هیچ ادعایی وجود ندارد که ببینیم نام و نام خانوادگی خالی نیستند. Person.Id کدگذاری شده است زیرا در این نمونه دلیلی برای افزایش شناسه وجود ندارد.

using Hanssens.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using WorkingWithLocalStorageApp.Classes;
using WorkingWithLocalStorageApp.Models;


namespace WorkingWithLocalStorageApp.Pages;
public class IndexModel : PageModel
{
    string LocalStorageKey => LocalSetup.Instance.Key;
    private LocalStorage _localStorage;

    [BindProperty]
    public Person Person { get; set; }

    public IndexModel(ILocalStorage storage) 
        => _localStorage = storage as LocalStorage;

    public void OnGet() { }

    public RedirectToPageResult OnPostSetLocalToLocalStorage()
    {
        Person.Id = 1;
        _localStorage.Store(LocalStorageKey,Person);
        _localStorage.Persist();

        return RedirectToPage("ViewPage");
    }

    public void OnPostGetFromLocalStorage()
    {
        var person = _localStorage.GetPerson>(LocalStorageKey);

        Log.Information("Person: {person}", person);
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

فایل رمزگذاری شده

محتویات فایل محلی

صفحه دریافت

از همان کلید صفحه ورودی/ورودی برای خواندن داده های شخص در نمونه جدیدی از ویژگی Person استفاده می کند و نام و نام خانوادگی را در صفحه نمایش می دهد.

public class ViewPageModel : PageModel
{
    private LocalStorage _localStorage;

    [BindProperty]
    public Person Person { get; set; }

    public ViewPageModel(ILocalStorage storage) 
        => _localStorage = storage as LocalStorage;

    public void OnGet()
    {
        Person = _localStorage.GetPerson>(LocalSetup.Instance.Key);
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خلاصه

کدی برای ثبت سرویسی ارائه شده است که سازنده مقادیری از سرویس ثبت شده دیگر را می خواهد. با دنبال کردن این موارد برای قرار گرفتن در جعبه ابزار توسعه‌دهندگان مایکروسافت سی شارپ مفید خواهد بود.

همچنین، کدی برای دریافت و ذخیره اطلاعاتی که می تواند بین جلسات و/یا صفحات به اشتراک گذاشته شود، کد کنید.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا