Warning: Undefined array key 0 in /var/www/tgoop/function.php on line 65

Warning: Trying to access array offset on value of type null in /var/www/tgoop/function.php on line 65
679 - Telegram Web
Telegram Web
#CleanArchitecture


CleanArchitecture

Clean Architecture Solution Template for .NET 5 Web Api

This is a solution template for creating Web Api ASP.NET Core following the principles of Clean Architecture.

Technologies

▫️ASP.NET Core 5
▪️Entity Framework Core 5
▫️ABluePredicateBuilder
▪️MediatR
▫️AutoMapper
▪️FluentValidation
▫️NUnit
▪️Docker


Features
🔸Event sourcing
🔹CQRS with MediatR Library
🔸MediatR Pipeline Logging & Validation
🔹Swagger UI
🔸Response Wrappers
🔹Pagination
🔸filter and sorting like ODATA with ABluePredicateBuilder
🔹In-Memory Caching
🔸In-Memory Database
🔹Custom Exception Handling Middlewares
🔸Fluent Validation
🔹Automapper
🔸Complete User Management Module (Register / Generate Token / Refresh token /Forgot Password / Confirmation Mail)
🔹User Auditing

Link : https://github.com/armanab/CleanArchitecture

@fullStackDevs
Forwarded from Web Devs
#Netcore
#DiagnosticSource


🔰DiagnosticSource

🔹مجموعه ای ساده و کاربردی از api ها که از طریق نوگت پکیج
System.Diagnostics.DiagnosticSource
در دسترش میباشد.
🔸بدین ترتیب دیگر لایبری ها مانند EF , SqlClient و ... با استفاده از DiagnosticSource ایونت هایی را در سیستم تحت یک نام مرتبط، ارسال میکنند و اپلیکیشن با دریافت این ایونت ها، آنها را پردازش میکند.
🔸 هر ایونتی که ارسال میشود علاوه بر نام، یک payload هم به همراه دارد و از انجایی که پردازش ایونت در همان فرایند ارسال اتفاق می افتد، این اطلاعات (payload) میتواند شامل هرنوع آبجکتی بدون نیاز به سریالایز یا دیسریالاز شدن باشد.

🔸همچنین DiagnosticSource در
AspNetCore و EntityFrameworkCore و HttpClient و SqlClient
نیز استفاده شده است و این قابلیت را به developer میدهد تا در خواست های ورودی و خروجی , دیتابیس کوئری ها را رهگیری (intercept) کند.
همچنین دسترسی به آبجکت هایی نظیر
HttpContext, DbConnection, DbCommand, HttpRequestMessage
و بسیاری دیگر امکان پذیر است و میتوانید در ایونت ارسال شده اگه نیاز باشد تغییراتی در آنها ایجاد کنید.


🔹 هدف از توضیح و معرفی DiagnosticSource در این پست این بود که گرچه DiagnosticSource چیزی جدیدی نیست اما دانستن اطلاعاتی در مورد آن میتواند در چالش های پیش رو به کمک ما بیاد
برای مثال Interceptor ها از نسخه 3.0 به Ef Core اضافه شدند و پیش از آن در نسخه های قبلی Ef Core پیاده سازی نشده بودند.
و امکان استفاده از Interceptor ها در نسخه های پایینتر Ef core وجود نداشت و برای این منظور میتوانیم از Diagnostic listener ها استفاده کنیم.

🔻 نکته : Diagnostic listener ها با Interceptor متفاوت هستند برای مثال یک Interceptor برای هر نمونه از DbContext رجیستر میشود در حالی که با Diagnostic listener میتوانید از ایونت های ارسال شده همه DbContext instance ها در اطلاعات, (payload) دریافت کنید.

🔹در asp core سه سیستم وجود دارد که از آنها برای logging می توان استفاده کرد که یک مورد آن DiagnosticSource میباشد. مورد بعدی سیستم ILogger است که استفاده از آن بسیار رایج است .
🔸اما یک تفاوت مهم وجود دارد و آن اینکه asp core از سیستم DiagnosticSource برای ایونت های مرتبط با زیر ساخت فریم وورک و از سیستم ILogger برای tracing جریان پراسس های اپلیکیشن استفاده میکند.

نمونه سورس کدی که از DiagnosticSource برای log ایونت ها استفاده شده است .


@fullStackDevs
This media is not supported in your browser
VIEW IN TELEGRAM
#Slack

Slack added this nice and cool quick voice calls, which is super useful

Can share screen and draw on it together with the team

Useful especially when you just need to quickly discuss something and don't have to worry about creating a meeting, calendar invite etc


اسلک این تماس های صوتی سریع و زیبا را اضافه کرد که بسیار مفید است

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

مفید است به ویژه هنگامی که شما فقط نیاز دارید که به سرعت در مورد موضوعی بحث کنید و نگران ایجاد یک جلسه ، دعوت تقویم و غیره نباشید

@fullStackDevs
Forwarded from Web Devs
#JS
#slice
#prototype
#trick
🌀 معرفی متد slice در جاوا اسکریپت :
Array.prototype.slice()

Syntax

slice()
slice(start)
slice(start, end)

متد slice عناصر انتخاب شده را در یک آرایه به عنوان یک شی آرایه جدید برمی گرداند.
دو تا پارامتر داره که start تا end ایندکس عناصر انتخاب شده را مشخص میکند. اگر فقط پارامتر start را مقدار بدید یعنی از مقدار ایندکس start ارایه تا انتهای عنصر ارایه انتخاب شود. مثال زیر را در نظر بگیرید :

const fruits = ['apple', 'banana', 'orange', 'Pineapple', 'Strawberry'];

console.log(fruits.slice(2));
// expected output: Array ["orange ", " Pineapple ", "Strawberry"]

console.log(fruits.slice(2, 4));
// expected output: Array ["orange ", " Pineapple "]

‼️ نکته: برای انتخاب از انتهای رشته از یک عدد منفی استفاده کنید (زمانی که شما پارامتر های start , end را مقدار منفی بدید کاملا برعکس مقدار مثبت عمل میکند):

  var fruits = ['apple', 'banana', 'orange', 'Pineapple', 'Strawberry'];
var myBest = fruits.slice(-3, -1);
// expected output: Array ["orange ", " Pineapple "]


string.prototype.slice()

متد slice در prototype استرینگ هم وجود دارد و قسمتهایی از یک رشته را استخراج کرده و قسمتهای استخراج شده را در یک رشته جدید برمی گرداند و پارامتر های شروع و پایان برای انتخاب شروع پایان رشته را نیز دارد.

var str = "Hello world!";
var res = str.slice(3, 8);
// expected output: "lo world! "

❗️ حالا تصور کنید میخوایید اعداد تک رقمی را دو رقمی نمایش دهید مانند نمایش ماه یا روز در تاریخ به صورت زیر :
1400/02/09

برای اینکه اعداد کوچکتراز ده ما همیشه دو رقمی نمایش داده شود و if و else هم استفاده نکنیم کافی است از همین متد slice استفاده کنیم به این صورت که یک “0” سمت چپ عدد ماه قرار میدیم و از انتها 2 کاراکتر از سمت راست یا انتها (2-) بر میداریم . بصورت زیر :
var myNumber = 7;
var myNumber2 = 11;
var formattedNumber = ("0" + myNumber).slice(-2);
// expected formattedNumber: 07

var formattedNumber2 = ("0" + myNumber2).slice(-2);
// expected formattedNumber2: 11


@fullStackDevs
#AOP

🔰AOP
🔹در این پست میخواهیم AOP رو مورد بررسی قرار دهیم.
در توسعه نرم افزار AOP یک مدل توسعه نرم افزار است که برای تکمیل OOP ( برنامه نویسی شی گرا) به وسیله جدا سازی concern ها اپلیکیشن برای رسیدن به ماژولاریتی استفاده میشود.
جداسازی concern ها با دسته بندی feature ها و behavior های اپلیکیشن به بخش های قابل مدیریت که هر کدام هدف خاصی دارن، نگهداری آنرا آسان تر میکند .
البته به کمک OOP امکان modularizing کردن concern ها به متد های مجزا و کلاس ها و package ها وجود دارد.

❇️ Aspect-Oriented Programming (AOP)

🔹یک تکنیک رایج برای ساخت راه کارهایی قابل استفاده در سراسر اپلیکیشن است که در طی توسعه نرم افزار، جداسازی منطق برنامه و تسک های قابل تکرار را تسهیل میکند.
مانند (input validation, logging, error handling, security)
🔸معماری یک اپلیکیشن اگر به خوبی طراحی شده باشد دارای لایه های متفاوت باید باشد و concern های مختلف در این معماری فقط در صورت نیاز باهم در ارتباط باشند.
▪️ فرض کنید یک اپلیکیشن loosely couple و maintainable طراحی کرده اید اما در میان راه نیازمند یه سری موارد هستید که ممکن است، نتوان آنها را در معماری به درستی جایگذاری کرد مانند :
▫️نیازمند سیستم authentication ای هستید برای بررسی احراز هویت کاربر قبل از هر کوئری به دیتا بیس
▫️ یا نیازمند است دیتاها قبل از insert در دیتابیس اعتبار سنجی شوند
▫️اپلیکیشن باید برای عملیات های حساس و مهم logging را انجام دهد.
▫️اپلیکیشن باید دارای یک سیستم debugging log جهت بررسی ok بودن عملیات ها باشد.
▫️اپلیکیشن باید دارای یک سیستم بررسی پرفورمنس باشد تا عملکرد عملیات های اپلیکیشن را بررسی کند.

🔸هر کدام از نیازمند های گفته شده نیازمند حجم زیادی از checking و کد میباشند.
علاوه بر آن امکان code duplication نیز وجود دارد و مجبورید کد های تکراری زیادی را در بخش های مختلف سیستم اضافه کنید. که نقض اصل DRY است و نگهداری اپلیکیشن را سخت میکند.
علاوه بر اینها هر تغییر کوچک در این نیازمندی ها باعث تغییرات عظیم در اپلیکیشن میشود.
🔹مواقعی که مجبور باشیم چنین الزاماتی را به اپلیکیشن خود اضافه کنیم، سوالی پیش می اید :
🔻 "چرا اصلا خود کامپایلر نمیتواند این کدهایی که در جاهای مختلف تکرار میشوند را اضافه کند ؟"
خبر خوب این است که چیزی به نام "aspect-oriented programming (AOP)" وجود دارد که general کد ها را از aspect ها در سراسر boundary های یک آبجکت یا یک لایه جدا میکند.
برای مثال logging در اپلیکیشن، وابسته به هیچ یک از لایه های اپلیکیشن نیست، بلکه باید در سراسر اپلیکیشن وجود داشته باشد و در همه جای برنامه بتوان آنرا اضافه کرد.
🔹از مزیت های AOP این است که فقط نیاز است نگران یک جای کد باشید. در یک جا کد بنویسید و آنرا در هرجایی که نیاز است اعمال کنید.

❇️ موارد استفاده از AOP بسیار زیاد است مانند :
▫️پیاده سازی logging در اپلیکیشن
▫️استفاده از authentication قبل از یک عملیات (اجازه دسترسی به کاربرانی که احراز هویت شده اند)
▫️پیاده سازی اعتبار سنجی و همچنین پیاده سازی سیستم اعلانی که با تغییر مقدار یک پراپرتی ایونتی را raise میکند.
▫️تغییر رفتار برخی متد ها.
🔸همانطور که میبینید AOP کاربرد های فراوانی دارد اما باید با احتیاط از آن استفاده کنید.
چون استفاده از آن برخی کد ها را در حالی که وجود دارند Hide میکند. همچنین aspect ها میتواند دارای باگی باشند یا تاثیر بسزایی در پرفورمنس اپلیکیشن داشته باشد. هزینه یک باگ جزئی در یک aspect ممکن است ساعت ها دیباگ کردن باشد. در نتیجه اگر aspect تان در جاهای دیگری ار اپلیکیشن استفاده نمیشود بهتر است مستقیما آنرا وارد کدتان کنید.

@fullStackDevs
Forwarded from Web Devs
#LoopOptimizations

Loop Optimizations in C# (and various other compilers)


This post comprises infographics showing various loop optimizations that happen in C# (dotnet).

🔗 Link

@fullStackDevs
#VSCode
#Github

A cool feature that GitHub has just added is the use of a point (.) key .wherever you are in the repository, which opens the code on the VS Code Editor browser

یک ویژگی جالب که GitHub به تازگی اضافه کرده است ، استفاده از کلید نقطه در هر کجا که در مخزن هستید ، است که کد را روی یک VS Code Editor browser باز می کند.
فقط برا ما گویا با وی پی ان باز میکنه 😐

@fullStackDevs
Forwarded from Web Devs
#javaScript_tricks
#js

❇️ در این پست چندتا تکنیک جاوا اسکریپتی معرفی میکنیم که امیداوریم براتون مفید واقع بشه.

🔹لاگ سریع در console به کمک object literal میتونید متغیرهاتون رو خیلی سریع و خوانا لاگ بزنید.
const myVar = 'foo'
const otherVar = 2

// output:
// {myVar: "foo", otherVar: 2}
console.log({ myVar, otherVar })

به
این ترتیب یه آبجکت میسازین و مقدار هر پراپرتیش به همراه نامش در کنسول لاگ میشه.

🔹نمایش نام پارامترهای تابع به همراه تایپ شون.
به کمک object destructuring در جاوا اسکریپت و مشخص کردن مقدار پیشفرض برای پارامتر های تابع میتونید موقع صدا زدن تابع نام پارامتر ها به همراه تایپ اونها رو داشته باشید و از آنجایی که به پارامترتون مقدار پیشفرض دادید به صورت optional هست و به شکل های متفاوت میتونید تابع تون رو صدا بزنید.

const notify = (msg, { type = 'info', timeout, close = true } = {}) => {
// display notification
}

notify('Hi!')
notify('Hi!', { type: 'error' })
notify('Hi!', { type: 'warn', close: false })

🔹کلون کردن آرایه.
از اونجایی که ارایه ها با رفرنسشون پاس داده میشن به کمک spread operator میتونید یک آرایه رو به راحتی کلون کنید.
const manipulateList = (list) => {
// defensively copy list
const copiedList = [
...list]

// do something with copiedList
}

🔹 اجباری کردن پارامترهای تابع
به کمک مقدار دهی پیشفرض برای پارامترهای تابع و به کمک این تکنیک میتونید پارامترهای توابع تون رو درصورتی که مقداری براشون پاس داده نشده اجباری کنید.
const throwIfMissing = () => {
throw new Error('Missing parameter')
}
const func = (requiredParam = throwIfMissing()) => {
// some implementation
}


🔹رکوئست های زماندار (برای fetch api)
دیگر لایبری های رایج جاوااسکریپتی مثل jquery ajax و axios این امکان رو بهتون میدن تا برای درخواستتون یک timeout تنظیم کنین و درصورتی که در زمان مشخص شده رکوئست انجام نشد، خودکار fail بشه.
متد fetch در مرورگر های جدید به صورت توکار چنین قابلیتی رو نداره اما به کمک این تکنیک میتونید اینکار رو انجام بدید.

const timeout = (delay = 30000) => {
return new Promise((resolve, reject) => {
const rejectWithError = () => {
reject(new Error('Timed out!'))
}

setTimeout(
rejectWithError, delay)
})
}

const fetchWithTimeout = (url, delay = 3000) => {
// construct an array to pass to `Promise.race`
return Promise.race([fetch(url),
timeout(delay)])
}

fetchWithTimeout('/json/data.json', 1000)
.then((response) => {
// successful response before the 1 s timeout
console.log('successful response', response)
})
.catch((e) => {
// Either the timeout occurred or some other error.
// Would need to check the method or use a custom
// Error subclass in timeout
console.error('request error', e)
})

🔹تبدیل رشته به عدد .
برای تبدیل رشته های عددی به معادل number ای شون از این تکنیک استفاده کنید.
let int = "15";

int =
+int;

اگر جایی امکان استفاده از عملگر + نداشتید از دوتا عملگر ~~ استفاده کنید.

@fullStackDevs
#Resful
#Rest


RESTFUL is not architecture

Rest is an architecture and restful is a service that implements this architecture.

🔅 There are 4 attribute for RestfulApi

1.client-server
Backend is server and frontend is client
and these are independent and scalable.

2. stateless
No data is stored on the server side and the server is never aware of the previous status of the client and does not face changes in the client server.

3.cacheable
Ability to cache response on the client side.

4.uniform interface
we can see method from url and Response hase satatus code for show detail to client.

✍️ fathollahi

@fullStackDevs
Forwarded from Web Devs
This media is not supported in your browser
VIEW IN TELEGRAM
Insights and productivity

The AI IntelliCode engine in Visual Studio continues to get better at seamlessly anticipating your next move. Visual Studio 2022 will provide more and deeper integrations into your daily workflows, helping you to take the right action in the right place at the right time.


📌 Link

@fullStackDevs
#js
#ECMAScript

javascript - ECMAScript


@fullStackDevs
Happy Programmers' Day

The Day of the Programmer is an international professional day that is celebrated on the 256th day of each year. The number 256 was chosen because it is the number of distinct values that can be represented with a byte, a value well known to programmers.

@fullStackDevs
Forwarded from Web Devs
#جاوا_اسکریپت


با استفاده از متد console.table
می‌تونید آرایه‌ای آبجکت ها رو در کنسول به جدول تبدیل کنید.

@fullStackDevs
#Js
#javascript
#Trick

Object.keys, values, entries

These methods are generic, there is a common agreement to use them for data structures. If we ever create a data structure of our own, we should implement them too.

They are supported for:

Map
Set
Array

Object.keys(obj) – returns an array of keys.
Object.values(obj) – returns an array of values.
Object.entries(obj) – returns an array of [key, value] pairs.

https://javascript.info/keys-values-entries

@fullStackDevs
#Js
#Function

JavaScript Functions 4 ways

1️⃣ Functions Declaration

A function created with a function declaration is a Function object and has all the properties, methods and behavior of Function objects.

2️⃣ Functions Expression

The function keyword can be used to define a function inside an expression.

The main difference between a function expression and a function declaration is the function name .

3️⃣ Arrow Function Expression

An arrow function expression is a compact alternative to a traditional function expression, but is limited and can't be used in all situations.

4️⃣ Concise Arrow Function Expression

Arrow functions can have either a "concise body" or the usual "block body".

In a concise body, only an expression is specified, which becomes the implicit return value. In a block body, you must use an explicit
return
statement.

@fullStackDevs
2025/07/06 08:57:47
Back to Top
HTML Embed Code: