‫۱۱ ماه قبل، دوشنبه ۳ مهر ۱۴۰۲، ساعت ۱۷:۵۸
یک نکته تکمیلی
حین استفاده از ControllerBase میتوانیم از یک تعداد helper برای خروجی اکشن‌ها استفاده کنیم؛ به عنوان مثال میتوانیم بعد از ساخت یک resource جدید از CreatedAtAction استفاده کنیم که به صورت خودکار خروجی 201 را برمیگرداند و همچنین هدر Location را نیز برایمان تنظیم خواهد کرد؛ 
[ApiController]
[Route("api/users")]
public class UserController : ControllerBase
{
    [HttpGet("{id:int}")]
    public ActionResult GetUserById(int id)
    {
        var user = new { Id = 1, Name = "Sirwan Afifi" };
        return Ok(user);
    }

    [HttpPost]
    public ActionResult CreateUser(CreateUserDto user)
    {
        return CreatedAtAction(nameof(GetUserById), new { user.Id }, user);
    }
}

اطلاعات بیشتر (+)

‫۱۱ ماه قبل، دوشنبه ۳ مهر ۱۴۰۲، ساعت ۱۳:۴۴
باسلام
با تشکر از مطلب کاربردی ارسالی، کد مربوطه کاملا درست کار میکند ولی وقتی مقادیر جدول Agent را برای ترسیم درخت وابستگی به این کد Assign میکنم در قسمت ChildrenSelector  فقط یک مرحله از Subgroup  را در درخت نشان میدهد. با در صورتی که برای طراحی Entity جدول Agent از مطالب شما در بخش خودارجاع استفاده نموده ام.

    //َAgent Entity
public class Agent:BaseEntity,ISoftDeleteModel { public int AgentId { get; set; } [MaxLength(300, ErrorMessage = "{0} حداکثر می‌تواند شامل {1} کاراکتر باشد")] public string Title { get; set; } public int Sort { get; set; } public bool IsDisplayed { get; set; } = true; [ForeignKey("Parent")] public int? ParentID { get; set; } public bool IsDeleted { get; set; } [InverseProperty("AgentSend")] public ICollection<LetterAgent> LetterAgentsSend { get; set; } [InverseProperty("AgentReceive")] public ICollection<LetterAgent> LetterAgentsReceive { get; set; } public ICollection<UserAgent> UserAgents { get; set; } public Agent? Parent { get; set; } public ICollection<Agent>? SubGroups { get; set; } }
فلوئنت مربوطه برای خود ارجاع کردن SubGroups در انتیتی Agent
            //SelfReferential
            modelBuilder.Entity<Agent>(entity =>
            {
                entity.HasIndex(e => e.ParentID);

                entity.HasOne(d => d.Parent)
                    .WithMany(p => p.SubGroups)
                    .HasForeignKey(d => d.ParentID);
            });
استفاده از کامپوننت درخت
        <DntTreeView
            TRecord="AgentDTO"
            Items="Comments"
            ChildrenSelector="m => m.SubGroups"
            style="list-style: none;"
            ChildrenHtmlAttributes="ChildrenHtmlAttributes">
            <ItemTemplate Context="record">
                <div class="card mb-1">
                    <div class="card-body">
                        <span>@record.Title</span>
                    </div>
                </div>
            </ItemTemplate>
            <EmptyContentTemplate>
                <div class="alert alert-warning">
                    There is no item to display!
                </div>
            </EmptyContentTemplate>
        </DntTreeView>

با تشکر
‫۱۱ ماه قبل، جمعه ۳۱ شهریور ۱۴۰۲، ساعت ۲۰:۵۰
در NET 8. نیز یک مفهومی اضافه شده تحت عنوان Keyed DI Services؛ با کمک این قابلیت میتوانیم سرویس‌ها را توسط یک کلید ثبت یا استفاده کنیم؛ برای استفاده از یک سرویس که با کلید هم ذخیره شده میتوانیم از پراپرتی FromKeyedServices استفاده کنیم:
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Options;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddSingleton<BigCacheConsumer>();
builder.Services.AddSingleton<SmallCacheConsumer>();

builder.Services.AddKeyedSingleton<IMemoryCache, BigCache>("big");
builder.Services.AddKeyedSingleton<IMemoryCache, SmallCache>("small");

var app = builder.Build();

app.MapGet("/big", (BigCacheConsumer data) => data.GetData());
app.MapGet("/small", (SmallCacheConsumer data) => data.GetData());

app.Run();

class BigCacheConsumer([FromKeyedServices("big")] IMemoryCache cache)
{
    public object? GetData() => cache.Get("data");
}

class SmallCacheConsumer(IKeyedServiceProvider keyedServiceProvider)
{
    public object? GetData() => keyedServiceProvider.GetRequiredKeyedService<IMemoryCache>("small");
}

‫۱ سال قبل، دوشنبه ۲۰ شهریور ۱۴۰۲، ساعت ۱۳:۵۹
یک نکته‌ی تکمیلی

تا دات نت 7 می‌توان از روش زیر برای انتخاب تصادفی اعضای یک مجموعه استفاده کرد:
‍MyCollection.OrderBy(x => Random.Shared.Next()).Take(10)
Random.Shared، به دات نت 6 برای تولید اعداد تصادفی thread-safe اضافه شد. اهمیت thread-safe بودن آن‌را در مطلب «اثبات قانون مشاهده‌گر در برنامه نویسی» می‌توانید مطالعه کنید.
‫۱ سال قبل، شنبه ۱۸ شهریور ۱۴۰۲، ساعت ۲۳:۲۶
یک نکته‌ی تکمیلی: لطفا ورودی‌های عددی را ()ToEnglishNumbers کنید!

در حین توسعه‌ی « DNTCaptcha.Core »، یکی از مواردی که به صورت مشکل بیان شد، عدم امکان کار با آن، در دستگاه‌های موبایل بود! مشکل اینجاست که در دستگاه‌های موبایل، زمانیکه صفحه کلید در حالت فارسی قرار دارد، اعداد را هم فارسی وارد می‌کند و اعداد این بازه‌ی خاص که در تصویر زیر مشخص هستند، حرف تشخیص داده می‌شوند و نه عدد:


اما ... ما انتظار داریم که اعداد را انگلیسی دریافت کنیم. به همین جهت اکثر سیستم‌های موجود، با دریافت ورودی عددی از طریق دستگاه‌های موبایل، زمانیکه صفحه کلید در حالت فارسی قرار دارد، مشکل دارند! برای رفع این مشکل فقط کافی است متد الحاقی ()ToEnglishNumbers را بر روی رشته‌ی دریافتی، فراخوانی کنید تا تبدیل به اعداد انگلیسی شود و قابلیت پردازش در برنامه را پیدا کند. اگر هم از کامپوننت‌های «DNTPersianComponents.Blazor» استفاده می‌کنید، این تبدیلات به صورت خودکار برای شما انجام خواهد شد.
مهندسی معکوس انواع و اقسام بانک‌های اطلاعاتی از پیش‌موجود به کلاس‌های Context و موجودیت‌های EF Core Code First

الف) SQL Server
وابستگی‌های مورد نیاز در یک پروژه‌ی classlib فرضی:
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net7.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.10">
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="7.0.10" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.10">
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
  </ItemGroup>
</Project>
و همچنین نصب ابزارهای خط‌فرمان EF:
dotnet tool update --global dotnet-ef --version 7.0.10
سپس اجرای دستور زیر در ریشه‌ی پروژه:
dotnet ef dbcontext scaffold "Data Source=(localdb)\mssqllocaldb;Initial Catalog=DbName;Encrypt=false;" Microsoft.EntityFrameworkCore.SqlServer -o Output -f

ب) MySQL
وابستگی‌های مورد نیاز در یک پروژه‌ی classlib فرضی:
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net7.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.10">
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
    <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="7.0.0" />
    <PackageReference Include="Pomelo.EntityFrameworkCore.MySql.Design" Version="1.1.2" />
  </ItemGroup>
</Project>
 و همچنین نصب ابزارهای خط‌فرمان EF:
dotnet tool update --global dotnet-ef --version 7.0.10
سپس اجرای دستور زیر در ریشه‌ی پروژه:
dotnet ef dbcontext scaffold "server=localhost;port=3306;user=root;password=MyPass;database=MyDbName;TreatTinyAsBoolean=true;AllowZeroDateTime=true;ConvertZeroDateTime=true;" Pomelo.EntityFrameworkCore.MySql -o Output -f

ج) Postgres 
وابستگی‌های مورد نیاز در یک پروژه‌ی classlib فرضی:
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net7.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.10">
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.10">
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
    <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="7.0.4"/>
  </ItemGroup>
</Project>
و همچنین نصب ابزارهای خط‌فرمان EF:
dotnet tool update --global dotnet-ef --version 7.0.10
سپس اجرای دستور زیر در ریشه‌ی پروژه:
dotnet ef dbcontext scaffold "User ID=Vahid;Password=MyPass;Host=localhost;Port=5432;Database=MyDbName;Pooling=true;" Npgsql.EntityFrameworkCore.PostgreSQL -o Output -f

د) SQLite
وابستگی‌های مورد نیاز در یک پروژه‌ی classlib فرضی: 
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net7.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.10">
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
    <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.10" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="7.0.10" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.10">
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
  </ItemGroup>
</Project>
 و همچنین نصب ابزارهای خط‌فرمان EF:
dotnet tool update --global dotnet-ef --version 7.0.10
سپس اجرای دستور زیر در ریشه‌ی پروژه: 
dotnet ef dbcontext scaffold "Data Source=C:\\Path\\db.sqlite" Microsoft.EntityFrameworkCore.Sqlite -o Output