Post #403
260

Cross-Cutting Concerns In Clean Architecture🔥
C# @csharpgeeks
Showing posts older than #404 · Back to latest


🚀 طراحی و پیادهسازی URL Shortener در NET. — بخش نهایی
🔗 کوتاهسازی لینک (URL Shortening)
public record ShortenUrlRequest(string Url);
app.MapPost("shorten", async (
ShortenUrlRequest request,
UrlShorteningService urlShorteningService,
ApplicationDbContext dbContext,
HttpContext httpContext) =>
{
if (!Uri.TryCreate(request.Url, UriKind.Absolute, out _))
{
return Results.BadRequest("The specified URL is invalid.");
}
var code = await urlShorteningService.GenerateUniqueCode();
var httpRequest = httpContext.Request;
var shortenedUrl = new ShortenedUrl
{
Id = Guid.NewGuid(),
LongUrl = request.Url,
Code = code,
ShortUrl = $"{httpRequest.Scheme}://{httpRequest.Host}/{code}",
CreatedOnUtc = DateTime.UtcNow
};
dbContext.ShortenedUrls.Add(shortenedUrl);
await dbContext.SaveChangesAsync();
return Results.Ok(shortenedUrl.ShortUrl);
});
📌 نکته:
🔁 ریدایرکت به URL اصلی (URL Redirection)
app.MapGet("{code}", async (string code, ApplicationDbContext dbContext) =>
{
var shortenedUrl = await dbContext
.ShortenedUrls
.SingleOrDefaultAsync(s => s.Code == code);
if (shortenedUrl is null)
{
return Results.NotFound();
}
return Results.Redirect(shortenedUrl.LongUrl);
});⚡️ نقاط قابل بهبود در سیستم کوتاهکننده لینک
🔖هشتگها:
#URLShortener #SystemDesign
🎯 تولید کد منحصربهفرد (Unique Code Generation) در URL Shortener
⚙️ رویکرد انتخابی ما
🧩 تعریف تنظیمات کوتاهسازی لینک
public static class ShortLinkSettings
{
public const int Length = 7;
public const string Alphabet =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
}
🧠 پیادهسازی سرویس تولید کد (UrlShorteningService)
public class UrlShorteningService(ApplicationDbContext dbContext)
{
private readonly Random _random = new();
public async Task<string> GenerateUniqueCode()
{
var codeChars = new char[ShortLinkSettings.Length];
const int maxValue = ShortLinkSettings.Alphabet.Length;
while (true)
{
for (var i = 0; i < ShortLinkSettings.Length; i++)
{
var randomIndex = _random.Next(maxValue);
codeChars[i] = ShortLinkSettings.Alphabet[randomIndex];
}
var code = new string(codeChars);
if (!await dbContext.ShortenedUrls.AnyAsync(s => s.Code == code))
{
return code;
}
}
}
}
⚠️ نقاط ضعف و بهبودهای احتمالی
🧱 مدل داده (Data Model) در ساخت URL Shortener با NET.
public class ShortenedUrl
{
public Guid Id { get; set; }
public string LongUrl { get; set; } = string.Empty;
public string ShortUrl { get; set; } = string.Empty;
public string Code { get; set; } = string.Empty;
public DateTime CreatedOnUtc { get; set; }
}
🧩 پیکربندی دیتابیس با Entity Framework Core
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions options)
: base(options)
{
}
public DbSet<ShortenedUrl> ShortenedUrls { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<ShortenedUrl>(builder =>
{
builder
.Property(shortenedUrl => shortenedUrl.Code)
.HasMaxLength(ShortLinkSettings.Length);
builder
.HasIndex(shortenedUrl => shortenedUrl.Code)
.IsUnique();
});
}
}
🌐 چگونه با NET. یک کوتاهکنندهٔ لینک بسازیم؟
⚙️ عملکردهای اصلی در یک URL Shortener
🧩 طراحی سیستم کوتاهکنندهٔ لینک (URL Shortener System Design)
🔢 تولید کد منحصربهفرد برای لینکها
🎲 استراتژی تولید کد تصادفی


1️⃣ ویژگی Autocomplete:
2️⃣ Spell Checker (تصحیح املایی):
3️⃣ Longest Prefix Matching (حداکثر طول پیشوند):
⚠️ محدودیتهای ساختار داده Trie
🔖هشتگها:
#Trie #DataStructure #PrefixMatching #Algorithms

⚔️ مقایسه Trie و Hash Table

🌳 ساختار داده Trie
⚡️ ویژگیهای ساختار داده Trie

SQL (پایگاهداده رابطهای)
NoSQL (پایگاهداده غیررابطهای)
🗂 پایگاهدادههای محبوب NoSQL و کاربرد آنها
💡 کاربردهای NoSQL
🔖هشتگها:
#NoSQL #SQL #Database #DatabaseDesign
🧠 مقدمهای بر NoSQL
🔑 ویژگیهای کلیدی پایگاهدادههای NoSQL
⚠️ چالشهای پایگاهدادههای NoSQL

Forwarded from tech-afternoon (Amin Mesbahi)
این مطلب صرفا نظر و تجربه شخصیه؛ نسخه جهانشمول یا خطکش نیست. تجربهی بیش از دو دهه تعامل و دقت در رفتارها و مسیر رشد آدمها از نگاه یک نفر از ۸ میلیارد جمعیت زمین است! قطعا میشه متون دقیقتر، کاملتر و موشکافانهتری هم نوشت؛ ولی شاید مرورش خالی از لطف نباشه...
📌مزایا و معایب
using System;
public class TokenBucket
{
private readonly int _capacity; // حداکثر تعداد توکنها
private readonly double _refillRate; // نرخ پر شدن (توکن در هر ثانیه)
private double _tokens; // تعداد توکنهای فعلی
private DateTime _lastRefill; // آخرین زمان پر شدن
public TokenBucket(int capacity, double refillRate)
{
_capacity = capacity;
_refillRate = refillRate;
_tokens = capacity;
_lastRefill = DateTime.UtcNow;
}
private void Refill()
{
var now = DateTime.UtcNow;
var elapsedSeconds = (now - _lastRefill).TotalSeconds;
var addedTokens = elapsedSeconds * _refillRate;
if (addedTokens >= 1)
{
_tokens = Math.Min(_capacity, _tokens + addedTokens);
_lastRefill = now;
}
}
public bool AllowRequest()
{
Refill();
if (_tokens >= 1)
{
_tokens -= 1;
return true;
}
return false;
}
}
public class Program
{
public static void Main()
{
var bucket = new TokenBucket(10, 1); // 10 توکن، پر شدن 1 توکن در هر ثانیه
// شبیهسازی درخواستها در بازههای 200 میلیثانیه
var timer = new System.Timers.Timer(200);
timer.Elapsed += (s, e) =>
{
Console.WriteLine($"Request allowed? {bucket.AllowRequest()}");
};
timer.Start();
Console.WriteLine("Press any key to stop...");
Console.ReadKey();
}
}
🚀 کاربردهای واقعی Token Bucket Algorithm
⚖️ مقایسه با سایر روشها
🏁 نتیجهگیری
🔖هشتگها:
#TokenBucket #RateLimiting #SystemDesign #API #Networking
🎯 الگوریتم Token Bucket
💡 Token Bucket چیست؟
🔁 نتیجه؟
🧮 فرمول ریاضی پشت Token Bucket
tokens = min(C, tokens + R * T)
if tokens > 0 → allow and tokens -= 1
else → reject
📊 مثال اجرا
