mirror of
https://github.com/kamranahmedse/developer-roadmap.git
synced 2026-03-14 18:51:53 +08:00
Compare commits
42 Commits
faqs/front
...
content/gr
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5abd6f2927 | ||
|
|
c2ce8ed50a | ||
|
|
6b836f4912 | ||
|
|
7c14032d45 | ||
|
|
463e047849 | ||
|
|
b074e64854 | ||
|
|
9ac1c1c8cb | ||
|
|
e3a6fda3c7 | ||
|
|
1ca0afbed9 | ||
|
|
f16bd09a47 | ||
|
|
f5fcf1dccc | ||
|
|
ac8711a0aa | ||
|
|
4745811114 | ||
|
|
12c1773965 | ||
|
|
ff0215673c | ||
|
|
f5e980d8ec | ||
|
|
6187b1dc52 | ||
|
|
a3b8b5653a | ||
|
|
8f8e2f41d8 | ||
|
|
89a436a5b7 | ||
|
|
231e295f01 | ||
|
|
64e20e9fc1 | ||
|
|
621f841fbf | ||
|
|
c61afb15bc | ||
|
|
595f3680be | ||
|
|
ee65c56bf3 | ||
|
|
a2c339f2d5 | ||
|
|
a3031a2371 | ||
|
|
952169ec8e | ||
|
|
fbd82ce215 | ||
|
|
35f61e876e | ||
|
|
bb9878fdb7 | ||
|
|
ee843cc9e2 | ||
|
|
cbd79ef299 | ||
|
|
af9e266190 | ||
|
|
0cbd401071 | ||
|
|
0929d40bd0 | ||
|
|
927aa0a066 | ||
|
|
85eff7f894 | ||
|
|
11695f4b05 | ||
|
|
aebee9b3a3 | ||
|
|
6b52baf093 |
4
.gitignore
vendored
4
.gitignore
vendored
@@ -20,3 +20,7 @@ pnpm-debug.log*
|
||||
|
||||
# macOS-specific files
|
||||
.DS_Store
|
||||
/test-results/
|
||||
/playwright-report/
|
||||
/playwright/.cache/
|
||||
tests-examples
|
||||
@@ -2,13 +2,18 @@ const fs = require('node:fs');
|
||||
const path = require('node:path');
|
||||
|
||||
const jsonsDir = path.join(process.cwd(), 'public/jsons');
|
||||
const jsonFiles = fs.readdirSync(jsonsDir);
|
||||
const childJsonDirs = fs.readdirSync(jsonsDir);
|
||||
|
||||
jsonFiles.forEach((jsonFileName) => {
|
||||
console.log(`Compressing ${jsonFileName}...`);
|
||||
childJsonDirs.forEach((childJsonDir) => {
|
||||
const fullChildJsonDirPath = path.join(jsonsDir, childJsonDir);
|
||||
const jsonFiles = fs.readdirSync(fullChildJsonDirPath);
|
||||
|
||||
const jsonFilePath = path.join(jsonsDir, jsonFileName);
|
||||
const json = require(jsonFilePath);
|
||||
jsonFiles.forEach((jsonFileName) => {
|
||||
console.log(`Compressing ${jsonFileName}...`);
|
||||
|
||||
fs.writeFileSync(jsonFilePath, JSON.stringify(json));
|
||||
const jsonFilePath = path.join(fullChildJsonDirPath, jsonFileName);
|
||||
const json = require(jsonFilePath);
|
||||
|
||||
fs.writeFileSync(jsonFilePath, JSON.stringify(json));
|
||||
});
|
||||
});
|
||||
|
||||
@@ -82,7 +82,7 @@ function prepareDirTree(control, dirTree, dirSortOrders) {
|
||||
return { dirTree, dirSortOrders };
|
||||
}
|
||||
|
||||
const roadmap = require(path.join(__dirname, `../public/jsons/${roadmapId}`));
|
||||
const roadmap = require(path.join(__dirname, `../public/jsons/roadmaps/${roadmapId}`));
|
||||
const controls = roadmap.mockup.controls.control;
|
||||
|
||||
// Prepare the dir tree that we will be creating and also calculate the sort orders
|
||||
|
||||
@@ -3,10 +3,10 @@
|
||||
First of all thank you for considering to contribute. Please look at the details below:
|
||||
|
||||
- [Contribution](#contribution)
|
||||
- [New Roadmaps](#new-roadmaps)
|
||||
- [Existing Roadmaps](#existing-roadmaps)
|
||||
- [Adding Content](#adding-content)
|
||||
- [Guidelines](#guidelines)
|
||||
- [New Roadmaps](#new-roadmaps)
|
||||
- [Existing Roadmaps](#existing-roadmaps)
|
||||
- [Adding Content](#adding-content)
|
||||
- [Guidelines](#guidelines)
|
||||
|
||||
## New Roadmaps
|
||||
|
||||
@@ -23,7 +23,7 @@ For the existing roadmaps, please follow the details listed for the nature of co
|
||||
|
||||
## Adding Content
|
||||
|
||||
Find [the content directory inside the relevant roadmap](https://github.com/kamranahmedse/roadmap-astro/tree/master/src/roadmaps). Please keep the following guidelines in mind when submitting content:
|
||||
Find [the content directory inside the relevant roadmap](https://github.com/kamranahmedse/developer-roadmap/tree/master/src/roadmaps). Please keep the following guidelines in mind when submitting content:
|
||||
|
||||
- Content must be in English.
|
||||
- Put a brief description about the topic on top of the file and the a list of links below with each link having title of the URL.
|
||||
|
||||
16
package.json
16
package.json
@@ -13,14 +13,14 @@
|
||||
"compress:jsons": "node bin/compress-jsons.cjs",
|
||||
"upgrade": "ncu -u",
|
||||
"roadmap-links": "node bin/roadmap-links.cjs",
|
||||
"roadmap-content": "node bin/roadmap-content.cjs"
|
||||
"roadmap-content": "node bin/roadmap-content.cjs",
|
||||
"test:e2e": "playwright test"
|
||||
},
|
||||
"dependencies": {
|
||||
"@astrojs/sitemap": "^1.0.0",
|
||||
"@astrojs/tailwind": "^2.1.3",
|
||||
"astro": "^1.8.0",
|
||||
"astro-compress": "^1.1.24",
|
||||
"astro-critters": "^1.1.24",
|
||||
"astro": "^1.9.2",
|
||||
"astro-compress": "^1.1.27",
|
||||
"node-html-parser": "^6.1.4",
|
||||
"npm-check-updates": "^16.6.2",
|
||||
"rehype-external-links": "^2.0.1",
|
||||
@@ -28,10 +28,12 @@
|
||||
"tailwindcss": "^3.2.4"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@tailwindcss/typography": "^0.5.8",
|
||||
"@playwright/test": "^1.29.2",
|
||||
"@tailwindcss/typography": "^0.5.9",
|
||||
"gh-pages": "^4.0.0",
|
||||
"json-to-pretty-yaml": "^1.2.2",
|
||||
"prettier": "^2.8.1",
|
||||
"prettier-plugin-astro": "^0.7.0"
|
||||
"markdown-it": "^13.0.1",
|
||||
"prettier": "^2.8.3",
|
||||
"prettier-plugin-astro": "^0.7.2"
|
||||
}
|
||||
}
|
||||
|
||||
108
playwright.config.ts
Normal file
108
playwright.config.ts
Normal file
@@ -0,0 +1,108 @@
|
||||
import type { PlaywrightTestConfig } from '@playwright/test';
|
||||
import { devices } from '@playwright/test';
|
||||
|
||||
/**
|
||||
* Read environment variables from file.
|
||||
* https://github.com/motdotla/dotenv
|
||||
*/
|
||||
// require('dotenv').config();
|
||||
|
||||
/**
|
||||
* See https://playwright.dev/docs/test-configuration.
|
||||
*/
|
||||
const config: PlaywrightTestConfig = {
|
||||
testDir: './tests',
|
||||
/* Maximum time one test can run for. */
|
||||
timeout: 30 * 1000,
|
||||
expect: {
|
||||
/**
|
||||
* Maximum time expect() should wait for the condition to be met.
|
||||
* For example in `await expect(locator).toHaveText();`
|
||||
*/
|
||||
timeout: 5000,
|
||||
},
|
||||
/* Run tests in files in parallel */
|
||||
fullyParallel: true,
|
||||
/* Fail the build on CI if you accidentally left test.only in the source code. */
|
||||
forbidOnly: !!process.env.CI,
|
||||
/* Retry on CI only */
|
||||
retries: process.env.CI ? 2 : 0,
|
||||
/* Opt out of parallel tests on CI. */
|
||||
workers: process.env.CI ? 1 : undefined,
|
||||
/* Reporter to use. See https://playwright.dev/docs/test-reporters */
|
||||
reporter: 'html',
|
||||
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
|
||||
use: {
|
||||
/* Maximum time each action such as `click()` can take. Defaults to 0 (no limit). */
|
||||
actionTimeout: 0,
|
||||
/* Base URL to use in actions like `await page.goto('/')`. */
|
||||
baseURL: 'http://localhost:3000',
|
||||
|
||||
/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
|
||||
trace: 'on-first-retry',
|
||||
},
|
||||
|
||||
/* Configure projects for major browsers */
|
||||
projects: [
|
||||
{
|
||||
name: 'chromium',
|
||||
use: {
|
||||
...devices['Desktop Chrome'],
|
||||
},
|
||||
},
|
||||
|
||||
// {
|
||||
// name: 'firefox',
|
||||
// use: {
|
||||
// ...devices['Desktop Firefox'],
|
||||
// },
|
||||
// },
|
||||
|
||||
// {
|
||||
// name: 'webkit',
|
||||
// use: {
|
||||
// ...devices['Desktop Safari'],
|
||||
// },
|
||||
// },
|
||||
|
||||
/* Test against mobile viewports. */
|
||||
// {
|
||||
// name: 'Mobile Chrome',
|
||||
// use: {
|
||||
// ...devices['Pixel 5'],
|
||||
// },
|
||||
// },
|
||||
// {
|
||||
// name: 'Mobile Safari',
|
||||
// use: {
|
||||
// ...devices['iPhone 12'],
|
||||
// },
|
||||
// },
|
||||
|
||||
/* Test against branded browsers. */
|
||||
// {
|
||||
// name: 'Microsoft Edge',
|
||||
// use: {
|
||||
// channel: 'msedge',
|
||||
// },
|
||||
// },
|
||||
// {
|
||||
// name: 'Google Chrome',
|
||||
// use: {
|
||||
// channel: 'chrome',
|
||||
// },
|
||||
// },
|
||||
],
|
||||
|
||||
/* Folder for test artifacts such as screenshots, videos, traces, etc. */
|
||||
// outputDir: 'test-results/',
|
||||
|
||||
/* Run your local dev server before starting the tests */
|
||||
webServer: {
|
||||
command: 'npm run dev',
|
||||
url: "http://localhost:3000",
|
||||
reuseExistingServer: !process.env.CI,
|
||||
},
|
||||
};
|
||||
|
||||
export default config;
|
||||
189
pnpm-lock.yaml
generated
189
pnpm-lock.yaml
generated
@@ -3,16 +3,17 @@ lockfileVersion: 5.4
|
||||
specifiers:
|
||||
'@astrojs/sitemap': ^1.0.0
|
||||
'@astrojs/tailwind': ^2.1.3
|
||||
'@tailwindcss/typography': ^0.5.8
|
||||
astro: ^1.8.0
|
||||
astro-compress: ^1.1.24
|
||||
astro-critters: ^1.1.24
|
||||
'@playwright/test': ^1.29.2
|
||||
'@tailwindcss/typography': ^0.5.9
|
||||
astro: ^1.9.2
|
||||
astro-compress: ^1.1.27
|
||||
gh-pages: ^4.0.0
|
||||
json-to-pretty-yaml: ^1.2.2
|
||||
markdown-it: ^13.0.1
|
||||
node-html-parser: ^6.1.4
|
||||
npm-check-updates: ^16.6.2
|
||||
prettier: ^2.8.1
|
||||
prettier-plugin-astro: ^0.7.0
|
||||
prettier: ^2.8.3
|
||||
prettier-plugin-astro: ^0.7.2
|
||||
rehype-external-links: ^2.0.1
|
||||
roadmap-renderer: ^1.0.1
|
||||
tailwindcss: ^3.2.4
|
||||
@@ -20,9 +21,8 @@ specifiers:
|
||||
dependencies:
|
||||
'@astrojs/sitemap': 1.0.0
|
||||
'@astrojs/tailwind': 2.1.3_tailwindcss@3.2.4
|
||||
astro: 1.8.0
|
||||
astro-compress: 1.1.24
|
||||
astro-critters: 1.1.24
|
||||
astro: 1.9.2
|
||||
astro-compress: 1.1.27
|
||||
node-html-parser: 6.1.4
|
||||
npm-check-updates: 16.6.2
|
||||
rehype-external-links: 2.0.1
|
||||
@@ -30,11 +30,13 @@ dependencies:
|
||||
tailwindcss: 3.2.4
|
||||
|
||||
devDependencies:
|
||||
'@tailwindcss/typography': 0.5.8_tailwindcss@3.2.4
|
||||
'@playwright/test': 1.29.2
|
||||
'@tailwindcss/typography': 0.5.9_tailwindcss@3.2.4
|
||||
gh-pages: 4.0.0
|
||||
json-to-pretty-yaml: 1.2.2
|
||||
prettier: 2.8.1
|
||||
prettier-plugin-astro: 0.7.0
|
||||
markdown-it: 13.0.1
|
||||
prettier: 2.8.3
|
||||
prettier-plugin-astro: 0.7.2
|
||||
|
||||
packages:
|
||||
|
||||
@@ -46,12 +48,8 @@ packages:
|
||||
'@jridgewell/trace-mapping': 0.3.17
|
||||
dev: false
|
||||
|
||||
/@astrojs/compiler/0.29.19:
|
||||
resolution: {integrity: sha512-lvPpoOA6Fc1NpJrPT65ZOhhFieYkiBds9wzOhWX55lXMUpNPu5CUxqzgDAkNSTIoXHZxkxHfi+6EpFNnRZBBYQ==}
|
||||
|
||||
/@astrojs/compiler/0.31.3:
|
||||
resolution: {integrity: sha512-WbA05QH5xkdaJ3XtzDuYOjtqsip2InW5rk156sSdaHs5qN2NroUHbzWZthHJwmNAAjQSGXVIj+O6jQj81zzX/Q==}
|
||||
dev: false
|
||||
|
||||
/@astrojs/language-server/0.28.3:
|
||||
resolution: {integrity: sha512-fPovAX/X46eE2w03jNRMpQ7W9m2mAvNt4Ay65lD9wl1Z5vIQYxlg7Enp9qP225muTr4jSVB5QiLumFJmZMAaVA==}
|
||||
@@ -59,8 +57,8 @@ packages:
|
||||
dependencies:
|
||||
'@vscode/emmet-helper': 2.8.6
|
||||
events: 3.3.0
|
||||
prettier: 2.8.1
|
||||
prettier-plugin-astro: 0.7.0
|
||||
prettier: 2.8.3
|
||||
prettier-plugin-astro: 0.7.2
|
||||
source-map: 0.7.4
|
||||
vscode-css-languageservice: 6.2.1
|
||||
vscode-html-languageservice: 5.0.3
|
||||
@@ -586,6 +584,15 @@ packages:
|
||||
tiny-glob: 0.2.9
|
||||
tslib: 2.4.1
|
||||
|
||||
/@playwright/test/1.29.2:
|
||||
resolution: {integrity: sha512-+3/GPwOgcoF0xLz/opTnahel1/y42PdcgZ4hs+BZGIUjtmEFSXGg+nFoaH3NSmuc7a6GSFwXDJ5L7VXpqzigNg==}
|
||||
engines: {node: '>=14'}
|
||||
hasBin: true
|
||||
dependencies:
|
||||
'@types/node': 17.0.45
|
||||
playwright-core: 1.29.2
|
||||
dev: true
|
||||
|
||||
/@pnpm/network.ca-file/1.0.2:
|
||||
resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==}
|
||||
engines: {node: '>=12.22.0'}
|
||||
@@ -633,8 +640,8 @@ packages:
|
||||
defer-to-connect: 2.0.1
|
||||
dev: false
|
||||
|
||||
/@tailwindcss/typography/0.5.8_tailwindcss@3.2.4:
|
||||
resolution: {integrity: sha512-xGQEp8KXN8Sd8m6R4xYmwxghmswrd0cPnNI2Lc6fmrC3OojysTBJJGSIVwPV56q4t6THFUK3HJ0EaWwpglSxWw==}
|
||||
/@tailwindcss/typography/0.5.9_tailwindcss@3.2.4:
|
||||
resolution: {integrity: sha512-t8Sg3DyynFysV9f4JDOVISGsjazNb48AeIYQwcL+Bsq5uf4RYL75C1giZ43KISjeDGBaTN3Kxh7Xj/vRSMJUUg==}
|
||||
peerDependencies:
|
||||
tailwindcss: '>=3.0.0 || insiders'
|
||||
dependencies:
|
||||
@@ -762,7 +769,6 @@ packages:
|
||||
|
||||
/@types/node/17.0.45:
|
||||
resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==}
|
||||
dev: false
|
||||
|
||||
/@types/parse5/6.0.3:
|
||||
resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==}
|
||||
@@ -778,8 +784,8 @@ packages:
|
||||
'@types/node': 17.0.45
|
||||
dev: false
|
||||
|
||||
/@types/sharp/0.31.0:
|
||||
resolution: {integrity: sha512-nwivOU101fYInCwdDcH/0/Ru6yIRXOpORx25ynEOc6/IakuCmjOAGpaO5VfUl4QkDtUC6hj+Z2eCQvgXOioknw==}
|
||||
/@types/sharp/0.31.1:
|
||||
resolution: {integrity: sha512-5nWwamN9ZFHXaYEincMSuza8nNfOof8nmO+mcI+Agx1uMUk4/pQnNIcix+9rLPXzKrm1pS34+6WRDbDV0Jn7ag==}
|
||||
dependencies:
|
||||
'@types/node': 17.0.45
|
||||
dev: false
|
||||
@@ -933,7 +939,6 @@ packages:
|
||||
|
||||
/argparse/2.0.1:
|
||||
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
|
||||
dev: false
|
||||
|
||||
/array-iterate/2.0.1:
|
||||
resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==}
|
||||
@@ -963,29 +968,22 @@ packages:
|
||||
tslib: 2.4.1
|
||||
dev: false
|
||||
|
||||
/astro-compress/1.1.24:
|
||||
resolution: {integrity: sha512-S7yzhmYdHxMPn8N3E7XJFKhTuHFrwLovPyhMJAuReVmhISvR0cxubGxaYnSJZrE67vFePj5Y8Gkd82GJIjFS2A==}
|
||||
/astro-compress/1.1.27:
|
||||
resolution: {integrity: sha512-7H7mfp4/BECckQGtyNJVYBI9jwWYX3rBcbL1EbhlgyDRbs3/thtJKDwW8xEaUvxox4R2bnNyzIET4XF/zGbozg==}
|
||||
dependencies:
|
||||
'@types/csso': 5.0.0
|
||||
'@types/html-minifier-terser': 7.0.0
|
||||
'@types/sharp': 0.31.0
|
||||
'@types/sharp': 0.31.1
|
||||
csso: 5.0.5
|
||||
files-pipeline: 0.0.2
|
||||
html-minifier-terser: 7.1.0
|
||||
sharp: 0.31.2
|
||||
sharp: 0.31.3
|
||||
svgo: 3.0.2
|
||||
terser: 5.16.1
|
||||
dev: false
|
||||
|
||||
/astro-critters/1.1.24:
|
||||
resolution: {integrity: sha512-yyvAka+LeWO0LToHSc53yTjI1eUQqBDBg6uDbjEJ4vvaKegF6z122VPCFQzLe2dPeJiyYLUMUs3W5CIErZEBqQ==}
|
||||
dependencies:
|
||||
critters: 0.0.16
|
||||
files-pipeline: 0.0.2
|
||||
dev: false
|
||||
|
||||
/astro/1.8.0:
|
||||
resolution: {integrity: sha512-MZIJveOC1OCIA0w2XmxjDtKviAEuYdF142DVq0VApInE1lm+CvAoyMgJs0a1h4mydD2vgQZpTjPhYKJIdxDjOA==}
|
||||
/astro/1.9.2:
|
||||
resolution: {integrity: sha512-L+Ma0eR0Aa6QZg7RF0lEs+106Ye1/zukvtq3KtsYIogAojltlwllwU9X5CwMBzFwA55NxpNp4gSRh5US/xb+8Q==}
|
||||
engines: {node: ^14.18.0 || >=16.12.0, npm: '>=6.14.0'}
|
||||
hasBin: true
|
||||
dependencies:
|
||||
@@ -1018,7 +1016,7 @@ packages:
|
||||
estree-walker: 3.0.1
|
||||
execa: 6.1.0
|
||||
fast-glob: 3.2.12
|
||||
github-slugger: 1.5.0
|
||||
github-slugger: 2.0.0
|
||||
gray-matter: 4.0.3
|
||||
html-entities: 2.3.3
|
||||
html-escaper: 3.0.3
|
||||
@@ -1510,17 +1508,6 @@ packages:
|
||||
engines: {node: '>= 0.6'}
|
||||
dev: false
|
||||
|
||||
/critters/0.0.16:
|
||||
resolution: {integrity: sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==}
|
||||
dependencies:
|
||||
chalk: 4.1.2
|
||||
css-select: 4.3.0
|
||||
parse5: 6.0.1
|
||||
parse5-htmlparser2-tree-adapter: 6.0.1
|
||||
postcss: 8.4.20
|
||||
pretty-bytes: 5.6.0
|
||||
dev: false
|
||||
|
||||
/cross-spawn/7.0.3:
|
||||
resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
|
||||
engines: {node: '>= 8'}
|
||||
@@ -1536,16 +1523,6 @@ packages:
|
||||
type-fest: 1.4.0
|
||||
dev: false
|
||||
|
||||
/css-select/4.3.0:
|
||||
resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==}
|
||||
dependencies:
|
||||
boolbase: 1.0.0
|
||||
css-what: 6.1.0
|
||||
domhandler: 4.3.1
|
||||
domutils: 2.8.0
|
||||
nth-check: 2.1.1
|
||||
dev: false
|
||||
|
||||
/css-select/5.1.0:
|
||||
resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==}
|
||||
dependencies:
|
||||
@@ -1714,14 +1691,6 @@ packages:
|
||||
/dlv/1.1.3:
|
||||
resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
|
||||
|
||||
/dom-serializer/1.4.1:
|
||||
resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==}
|
||||
dependencies:
|
||||
domelementtype: 2.3.0
|
||||
domhandler: 4.3.1
|
||||
entities: 2.2.0
|
||||
dev: false
|
||||
|
||||
/dom-serializer/2.0.0:
|
||||
resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
|
||||
dependencies:
|
||||
@@ -1734,13 +1703,6 @@ packages:
|
||||
resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
|
||||
dev: false
|
||||
|
||||
/domhandler/4.3.1:
|
||||
resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==}
|
||||
engines: {node: '>= 4'}
|
||||
dependencies:
|
||||
domelementtype: 2.3.0
|
||||
dev: false
|
||||
|
||||
/domhandler/5.0.3:
|
||||
resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
|
||||
engines: {node: '>= 4'}
|
||||
@@ -1748,14 +1710,6 @@ packages:
|
||||
domelementtype: 2.3.0
|
||||
dev: false
|
||||
|
||||
/domutils/2.8.0:
|
||||
resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==}
|
||||
dependencies:
|
||||
dom-serializer: 1.4.1
|
||||
domelementtype: 2.3.0
|
||||
domhandler: 4.3.1
|
||||
dev: false
|
||||
|
||||
/domutils/3.0.1:
|
||||
resolution: {integrity: sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==}
|
||||
dependencies:
|
||||
@@ -1824,9 +1778,10 @@ packages:
|
||||
once: 1.4.0
|
||||
dev: false
|
||||
|
||||
/entities/2.2.0:
|
||||
resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==}
|
||||
dev: false
|
||||
/entities/3.0.1:
|
||||
resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==}
|
||||
engines: {node: '>=0.12'}
|
||||
dev: true
|
||||
|
||||
/entities/4.4.0:
|
||||
resolution: {integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==}
|
||||
@@ -2346,6 +2301,10 @@ packages:
|
||||
resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==}
|
||||
dev: false
|
||||
|
||||
/github-slugger/2.0.0:
|
||||
resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==}
|
||||
dev: false
|
||||
|
||||
/glob-parent/5.1.2:
|
||||
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
|
||||
engines: {node: '>= 6'}
|
||||
@@ -3040,6 +2999,12 @@ packages:
|
||||
resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
/linkify-it/4.0.1:
|
||||
resolution: {integrity: sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==}
|
||||
dependencies:
|
||||
uc.micro: 1.0.6
|
||||
dev: true
|
||||
|
||||
/load-yaml-file/0.2.0:
|
||||
resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==}
|
||||
engines: {node: '>=6'}
|
||||
@@ -3183,6 +3148,17 @@ packages:
|
||||
- supports-color
|
||||
dev: false
|
||||
|
||||
/markdown-it/13.0.1:
|
||||
resolution: {integrity: sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==}
|
||||
hasBin: true
|
||||
dependencies:
|
||||
argparse: 2.0.1
|
||||
entities: 3.0.1
|
||||
linkify-it: 4.0.1
|
||||
mdurl: 1.0.1
|
||||
uc.micro: 1.0.6
|
||||
dev: true
|
||||
|
||||
/markdown-table/3.0.3:
|
||||
resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==}
|
||||
dev: false
|
||||
@@ -3348,6 +3324,10 @@ packages:
|
||||
resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==}
|
||||
dev: false
|
||||
|
||||
/mdurl/1.0.1:
|
||||
resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==}
|
||||
dev: true
|
||||
|
||||
/merge-stream/2.0.0:
|
||||
resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
|
||||
dev: false
|
||||
@@ -4207,12 +4187,6 @@ packages:
|
||||
unist-util-visit-children: 2.0.1
|
||||
dev: false
|
||||
|
||||
/parse5-htmlparser2-tree-adapter/6.0.1:
|
||||
resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==}
|
||||
dependencies:
|
||||
parse5: 6.0.1
|
||||
dev: false
|
||||
|
||||
/parse5/6.0.1:
|
||||
resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==}
|
||||
dev: false
|
||||
@@ -4291,6 +4265,12 @@ packages:
|
||||
dependencies:
|
||||
find-up: 4.1.0
|
||||
|
||||
/playwright-core/1.29.2:
|
||||
resolution: {integrity: sha512-94QXm4PMgFoHAhlCuoWyaBYKb92yOcGVHdQLoxQ7Wjlc7Flg4aC/jbFW7xMR52OfXMVkWicue4WXE7QEegbIRA==}
|
||||
engines: {node: '>=14'}
|
||||
hasBin: true
|
||||
dev: true
|
||||
|
||||
/postcss-import/14.1.0_postcss@8.4.20:
|
||||
resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==}
|
||||
engines: {node: '>=10.0.0'}
|
||||
@@ -4391,25 +4371,20 @@ packages:
|
||||
which-pm: 2.0.0
|
||||
dev: false
|
||||
|
||||
/prettier-plugin-astro/0.7.0:
|
||||
resolution: {integrity: sha512-ehCUx7MqHWvkHwUmxxAWLsL35pFaCTM5YXQ8xjG/1W6dY2yBhvEks+2aCfjeI5zmMrZNCXkiMQtpznSlLSLrxw==}
|
||||
engines: {node: ^14.15.0 || >=16.0.0, npm: '>=6.14.0'}
|
||||
/prettier-plugin-astro/0.7.2:
|
||||
resolution: {integrity: sha512-mmifnkG160BtC727gqoimoxnZT/dwr8ASxpoGGl6EHevhfblSOeu+pwH1LAm5Qu1MynizktztFujHHaijLCkww==}
|
||||
engines: {node: ^14.15.0 || >=16.0.0, pnpm: '>=7.14.0'}
|
||||
dependencies:
|
||||
'@astrojs/compiler': 0.29.19
|
||||
prettier: 2.8.1
|
||||
'@astrojs/compiler': 0.31.3
|
||||
prettier: 2.8.3
|
||||
sass-formatter: 0.7.5
|
||||
synckit: 0.8.4
|
||||
|
||||
/prettier/2.8.1:
|
||||
resolution: {integrity: sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==}
|
||||
/prettier/2.8.3:
|
||||
resolution: {integrity: sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw==}
|
||||
engines: {node: '>=10.13.0'}
|
||||
hasBin: true
|
||||
|
||||
/pretty-bytes/5.6.0:
|
||||
resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==}
|
||||
engines: {node: '>=6'}
|
||||
dev: false
|
||||
|
||||
/prismjs/1.29.0:
|
||||
resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==}
|
||||
engines: {node: '>=6'}
|
||||
@@ -4858,8 +4833,8 @@ packages:
|
||||
resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==}
|
||||
dev: false
|
||||
|
||||
/sharp/0.31.2:
|
||||
resolution: {integrity: sha512-DUdNVEXgS5A97cTagSLIIp8dUZ/lZtk78iNVZgHdHbx1qnQR7JAHY0BnXnwwH39Iw+VKhO08CTYhIg0p98vQ5Q==}
|
||||
/sharp/0.31.3:
|
||||
resolution: {integrity: sha512-XcR4+FCLBFKw1bdB+GEhnUNXNXvnt0tDo4WsBsraKymuo/IAuPuCBVAL2wIkUw2r/dwFW5Q5+g66Kwl2dgDFVg==}
|
||||
engines: {node: '>=14.15.0'}
|
||||
requiresBuild: true
|
||||
dependencies:
|
||||
@@ -5345,6 +5320,10 @@ packages:
|
||||
hasBin: true
|
||||
dev: false
|
||||
|
||||
/uc.micro/1.0.6:
|
||||
resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==}
|
||||
dev: true
|
||||
|
||||
/unherit/3.0.1:
|
||||
resolution: {integrity: sha512-akOOQ/Yln8a2sgcLj4U0Jmx0R5jpIg2IUyRrWOzmEbjBtGzBdHtSeFKgoEcoH4KYIG/Pb8GQ/BwtYm0GCq1Sqg==}
|
||||
dev: false
|
||||
|
||||
BIN
public/images/system-design.png
Normal file
BIN
public/images/system-design.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 832 KiB |
1
public/jsons/checklists/frontend-performance.json
Normal file
1
public/jsons/checklists/frontend-performance.json
Normal file
File diff suppressed because one or more lines are too long
1
public/jsons/roadmaps/system-design.json
Normal file
1
public/jsons/roadmaps/system-design.json
Normal file
File diff suppressed because one or more lines are too long
BIN
public/pdfs/system-design.pdf
Normal file
BIN
public/pdfs/system-design.pdf
Normal file
Binary file not shown.
@@ -1,3 +1,3 @@
|
||||
<div class='text-sm sm:text-base leading-relaxed text-left p-2 sm:p-4 text-md text-gray-800 border-t border-t-gray-300 bg-gray-100 rounded-bl-md rounded-br-md'>
|
||||
<div class='text-sm sm:text-base leading-relaxed text-left p-2 sm:p-4 text-md text-gray-800 border-t border-t-gray-300 bg-gray-100 rounded-bl-md rounded-br-md [&>p:not(:last-child)]:mb-3 [&>p>a]:underline [&>p>a]:text-blue-500'>
|
||||
<slot />
|
||||
</div>
|
||||
@@ -1,13 +1,42 @@
|
||||
---
|
||||
import { markdownToHtml } from '../../lib/markdown';
|
||||
import Answer from './Answer.astro';
|
||||
import Question from './Question.astro';
|
||||
|
||||
export type FAQType = {
|
||||
question: string;
|
||||
answer: string[];
|
||||
};
|
||||
|
||||
export interface Props {
|
||||
faqs: FAQType[];
|
||||
}
|
||||
|
||||
const { faqs } = Astro.props;
|
||||
|
||||
if (faqs.length === 0) {
|
||||
return '';
|
||||
}
|
||||
---
|
||||
|
||||
<div class='border-t bg-gray-100'>
|
||||
<div class='container'>
|
||||
<div class='flex justify-between relative -top-5'>
|
||||
<h1 class='text-sm sm:text-base font-medium py-1 px-3 border bg-white rounded-md'>
|
||||
Frequently Asked Questions
|
||||
</h1>
|
||||
<h1 class='text-sm sm:text-base font-medium py-1 px-3 border bg-white rounded-md'>Frequently Asked Questions</h1>
|
||||
</div>
|
||||
|
||||
<div class='flex flex-col gap-1 pb-8'>
|
||||
<slot />
|
||||
{
|
||||
faqs.map((faq, questionIndex) => (
|
||||
<Question isActive={questionIndex === 0} question={faq.question}>
|
||||
<Answer>
|
||||
{faq.answer.map((answer) => (
|
||||
<p set:html={markdownToHtml(answer)} />
|
||||
))}
|
||||
</Answer>
|
||||
</Question>
|
||||
))
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -43,7 +43,7 @@ import Icon from './Icon.astro';
|
||||
<span class='text-gray-400 mx-2'>by</span>
|
||||
<a
|
||||
class='bg-blue-600 text-sm py-1 px-1.5 font-regular hover:bg-blue-700 rounded-md'
|
||||
href='https://twitter.com/kamranahmedse'
|
||||
href='https://twitter.com/intent/user?screen_name=kamranahmedse'
|
||||
target='_blank'
|
||||
>
|
||||
<span class='hidden sm:inline'>@kamranahmedse</span>
|
||||
|
||||
@@ -10,7 +10,7 @@ export interface Props {
|
||||
const { roadmapId, description } = Astro.props;
|
||||
---
|
||||
|
||||
<div class='bg-gray-50 py-4 sm:py-10'>
|
||||
<div class='bg-gray-50 py-2'>
|
||||
<div
|
||||
class='container prose prose-headings:mt-4 prose-headings:mb-2 prose-p:mb-0.5 relative prose-code:text-white'
|
||||
>
|
||||
|
||||
@@ -1,26 +1,21 @@
|
||||
---
|
||||
import Icon from './Icon.astro';
|
||||
import ResourcesAlert from './ResourcesAlert.astro';
|
||||
import RoadmapNote from './RoadmapNote.astro';
|
||||
import TopicSearch from './TopicSearch/TopicSearch.astro';
|
||||
import YouTubeAlert from './YouTubeAlert.astro';
|
||||
|
||||
export interface Props {
|
||||
title: string;
|
||||
description: string;
|
||||
note?: string;
|
||||
roadmapId: string;
|
||||
isUpcoming?: boolean;
|
||||
hasSearch?: boolean;
|
||||
hasTopics?: boolean;
|
||||
}
|
||||
|
||||
const {
|
||||
title,
|
||||
description,
|
||||
roadmapId,
|
||||
isUpcoming = false,
|
||||
hasSearch = false,
|
||||
hasTopics = false,
|
||||
} = Astro.props;
|
||||
const { title, description, roadmapId, isUpcoming = false, hasSearch = false, note, hasTopics = false } = Astro.props;
|
||||
|
||||
const isRoadmapReady = !isUpcoming;
|
||||
---
|
||||
@@ -114,3 +109,5 @@ const isRoadmapReady = !isUpcoming;
|
||||
{hasSearch && <TopicSearch />}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{note && <RoadmapNote text={note} />}
|
||||
|
||||
19
src/components/RoadmapNote.astro
Normal file
19
src/components/RoadmapNote.astro
Normal file
@@ -0,0 +1,19 @@
|
||||
---
|
||||
import { Debug } from 'astro/components';
|
||||
import { markdownToHtml } from '../lib/markdown';
|
||||
|
||||
export interface Props {
|
||||
text: string;
|
||||
}
|
||||
|
||||
const { text } = Astro.props;
|
||||
---
|
||||
|
||||
<div class='bg-gray-50'>
|
||||
<div class='container pt-1'>
|
||||
<p
|
||||
class='text-sm bg-yellow-100 text-yellow-900 p-2 rounded-md mt-2 sm:mt-5 mb-0 sm:-mb-6 z-10 relative [&>a]:underline'
|
||||
set:html={markdownToHtml(text.trim())}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
76
src/guides/consistency-patterns-in-distributed-systems.md
Normal file
76
src/guides/consistency-patterns-in-distributed-systems.md
Normal file
@@ -0,0 +1,76 @@
|
||||
---
|
||||
title: "Consistency Patterns"
|
||||
description: "Everything you need to know about Week, Strong and Eventual Consistency"
|
||||
author:
|
||||
name: "Kamran Ahmed"
|
||||
url: "https://twitter.com/kamranahmedse"
|
||||
imageUrl: "/authors/kamranahmedse.jpeg"
|
||||
seo:
|
||||
title: "Consistency Patterns - roadmap.sh"
|
||||
description: "Everything you need to know about Week, Strong and Eventual Consistency"
|
||||
isNew: true
|
||||
canonicalUrl: "https://cs.fyi/guide/consistency-patterns-week-strong-eventual/"
|
||||
type: "textual"
|
||||
date: 2023-01-18
|
||||
sitemap:
|
||||
priority: 0.7
|
||||
changefreq: "weekly"
|
||||
tags:
|
||||
- "guide"
|
||||
- "visual-guide"
|
||||
- "guide-sitemap"
|
||||
---
|
||||
|
||||
Before we talk about the Consistency Patterns, we should know what a distributed system is. Simply put, a distributed system is a system that consists of more than one components, and each component is responsible for one part of the application.
|
||||
|
||||
> A distributed system is a system whose components are located on different networked computers, which communicate and coordinate their actions by passing messages to one another. The components interact with one another in order to achieve a common goal. - Wikipedia
|
||||
|
||||
## Distributed Systems
|
||||
|
||||
Imagine we have an e-commerce application where we are selling books. This application may consist of multiple different components. For example, one server might be responsible for the accounts, another might be responsible for the payments, one might be responsible for storing orders, one might be responsible for loyalty points and relevant functionalities, and another might be responsible for maintaining the books inventory and so on.
|
||||
|
||||

|
||||
|
||||
Now, if a user buys a book, there might be different services involved in placing the order; order service for storing the order, payment service for handling the payments, and inventory service for keeping the stock of that ordered book up to date. This is an example of a distributed system, an application that consists of multiple different components, each of which is responsible for a different part of the application.
|
||||
|
||||
## Why is Consistency Important?
|
||||
|
||||
When working with distributed systems, we need to think about managing the data across different servers. If we take the above example of the e-commerce application, we can see that the inventory service must have up-to-date stock information for the ordered items if the user places an order. Now, there might be two different users looking at the same book. Now imagine if one of the customers places a successful order, and before the inventory service can update the stock, the second customer also places the order for the same book. In that case, when the inventory wasn't updated, we will have the wrong stock information when the second order was placed, i.e., the ordered book may or may not be available in stock. This is where different consistency patterns come into play. They help ensure that the data is consistent across the application.
|
||||
|
||||
## Consistency Patterns
|
||||
|
||||
Consistency patterns refer to the ways in which data is stored and managed in a distributed system and how that data is made available to users and applications. There are three main types of consistency patterns:
|
||||
|
||||
* Strong consistency
|
||||
* Weak consistency
|
||||
* Eventual Consistency
|
||||
|
||||
Each of these patterns has its own advantages and disadvantages, and the choice of which pattern to use will depend on the specific requirements of the application or system.
|
||||
|
||||
### Strong Consistency
|
||||
|
||||
> After an update is made to the data, it will be immediately visible to any subsequent read operations. The data is replicated in a synchronous manner, ensuring that all copies of the data are updated at the same time.
|
||||
|
||||
In a strong consistency system, any updates to some data are immediately propagated to all locations. This ensures that all locations have the same version of the data, but it also means that the system is not highly available and has high latency.
|
||||
|
||||
An example of strong consistency is a financial system where users can transfer money between accounts. The system is designed for **high data integrity**, so the data is stored in a single location and updates to that data are immediately propagated to all other locations. This ensures that all users and applications are working with the same, accurate data. For instance, when a user initiates a transfer of funds from one account to another, the system immediately updates the balance of both accounts and all other system components are immediately aware of the change. This ensures that all users can see the updated balance of both accounts and prevents any discrepancies.
|
||||
|
||||
### Weak Consistency
|
||||
|
||||
> After an update is made to the data, it is not guaranteed that any subsequent read operation will immediately reflect the changes made. The read **may or may not** see the recent write.
|
||||
|
||||
In a weakly consistent system, updates to the data may not be immediately propagated. This can lead to inconsistencies and conflicts between different versions of the data, but it also allows for **high availability and low latency**.
|
||||
|
||||
Another example of weak consistency is a gaming platform where users can play online multiplayer games. When a user plays a game, their actions are immediately visible to other players in the same data center, but if there was a lag or temporary connectoin loss, the actions may not be seen by some of the users and the game will continue. This can lead to inconsistencies between different versions of the game state, but it also allows for a high level of availability and low latency.
|
||||
|
||||
### Eventual Consistency
|
||||
|
||||
> Eventual consistency is a form of Weak Consistency. After an update is made to the data, it will be eventually visible to any subsequent read operations. The data is replicated in an asynchronous manner, ensuring that all copies of the data are eventually updated.
|
||||
|
||||
In an eventually consistent system, data is typically stored in multiple locations, and updates to that data are eventually propagated to all locations. This means that the system is highly available and has low latency, but it also means that there may be inconsistencies and conflicts between different versions of the data.
|
||||
|
||||
An example of eventual consistency is a social media platform where users can post updates, comments, and messages. The platform is designed for high availability and low latency, so the data is stored in multiple data centers around the world. When a user posts an update, the update is immediately visible to other users in the same data center, but it may take some time for the update to propagate to other data centers. This means that some users may see the update while others may not, depending on which data center they are connected to. This can lead to inconsistencies between different versions of the data, but it also allows for a high level of availability and low latency.
|
||||
|
||||
## Conclusion
|
||||
|
||||
In conclusion, consistency patterns play a crucial role in distributed systems, and the choice of which pattern to use will depend on the specific requirements of the application or system. Each pattern has its own advantages and disadvantages, and each is more suitable for different use cases. Weak consistency is suitable for systems that require high availability and low latency, strong consistency is suitable for systems that require high data integrity, and eventual consistency is suitable for systems that require both high availability and high data integrity.
|
||||
@@ -14,9 +14,10 @@ export interface Props {
|
||||
description?: string;
|
||||
keywords?: string[];
|
||||
noIndex?: boolean;
|
||||
canonicalUrl?: string;
|
||||
permalink?: string;
|
||||
sponsor?: SponsorType;
|
||||
jsonLd?: Record<string, unknown>;
|
||||
jsonLd?: Record<string, unknown>[];
|
||||
}
|
||||
|
||||
const {
|
||||
@@ -25,13 +26,16 @@ const {
|
||||
keywords = siteConfig.keywords,
|
||||
noIndex = false,
|
||||
permalink = '',
|
||||
canonicalUrl: givenCanonical = '',
|
||||
sponsor,
|
||||
jsonLd,
|
||||
jsonLd = [],
|
||||
} = Astro.props;
|
||||
|
||||
// Remove trailing slashes to consider the page as canonical
|
||||
const currentPageAbsoluteUrl = `https://roadmap.sh${permalink}`;
|
||||
|
||||
const canonicalUrl = givenCanonical || currentPageAbsoluteUrl;
|
||||
|
||||
const commitUrl = `https://github.com/kamranahmedse/developer-roadmap/commit/${import.meta.env.GITHUB_SHA}`;
|
||||
---
|
||||
|
||||
@@ -65,7 +69,7 @@ const commitUrl = `https://github.com/kamranahmedse/developer-roadmap/commit/${i
|
||||
<meta property='og:type' content='website' />
|
||||
<meta property='og:url' content={currentPageAbsoluteUrl} />
|
||||
|
||||
<link rel='canonical' href={currentPageAbsoluteUrl} />
|
||||
<link rel='canonical' href={canonicalUrl} />
|
||||
|
||||
<meta name='mobile-web-app-capable' content='yes' />
|
||||
<meta name='apple-mobile-web-app-capable' content='yes' />
|
||||
@@ -85,7 +89,7 @@ const commitUrl = `https://github.com/kamranahmedse/developer-roadmap/commit/${i
|
||||
<link rel='icon' href='/manifest/favicon.ico' type='image/x-icon' />
|
||||
|
||||
<slot name='after-header' />
|
||||
{jsonLd && <script type='application/ld+json' set:html={JSON.stringify(jsonLd)} />}
|
||||
{jsonLd.length > 0 && <script type='application/ld+json' set:html={JSON.stringify(jsonLd)} />}
|
||||
</head>
|
||||
<body>
|
||||
<YouTubeBanner />
|
||||
|
||||
@@ -8,6 +8,7 @@ export interface GuideFrontmatter {
|
||||
url: string;
|
||||
imageUrl: string;
|
||||
};
|
||||
canonicalUrl?: string;
|
||||
seo: {
|
||||
title: string;
|
||||
description: string;
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import type { FAQType } from '../components/FAQs/FAQs.astro';
|
||||
|
||||
type ArticleSchemaProps = {
|
||||
url: string;
|
||||
headline: string;
|
||||
@@ -8,8 +10,7 @@ type ArticleSchemaProps = {
|
||||
};
|
||||
|
||||
export function generateArticleSchema(article: ArticleSchemaProps) {
|
||||
const { url, headline, description, imageUrl, datePublished, dateModified } =
|
||||
article;
|
||||
const { url, headline, description, imageUrl, datePublished, dateModified } = article;
|
||||
|
||||
return {
|
||||
'@context': 'https://schema.org',
|
||||
@@ -38,3 +39,18 @@ export function generateArticleSchema(article: ArticleSchemaProps) {
|
||||
dateModified: dateModified,
|
||||
};
|
||||
}
|
||||
|
||||
export function generateFAQSchema(faqs: FAQType[]) {
|
||||
return {
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'FAQPage',
|
||||
mainEntity: faqs.map((faq) => ({
|
||||
'@type': 'Question',
|
||||
name: faq.question,
|
||||
acceptedAnswer: {
|
||||
'@type': 'Answer',
|
||||
text: faq.answer.join(' '),
|
||||
},
|
||||
})),
|
||||
};
|
||||
}
|
||||
|
||||
8
src/lib/markdown.ts
Normal file
8
src/lib/markdown.ts
Normal file
@@ -0,0 +1,8 @@
|
||||
// @ts-ignore
|
||||
import MarkdownIt from 'markdown-it';
|
||||
|
||||
export function markdownToHtml(markdown: string): string {
|
||||
const md = new MarkdownIt();
|
||||
|
||||
return md.renderInline(markdown);
|
||||
}
|
||||
@@ -12,6 +12,7 @@ export interface RoadmapFrontmatter {
|
||||
hasTopics: boolean;
|
||||
isNew: boolean;
|
||||
isUpcoming: boolean;
|
||||
note?: string;
|
||||
dimensions?: {
|
||||
width: number;
|
||||
height: number;
|
||||
|
||||
@@ -3,7 +3,6 @@ import Breadcrumbs from '../components/Breadcrumbs.astro';
|
||||
import RoadmapBanner from '../components/RoadmapBanner.astro';
|
||||
import BaseLayout from '../layouts/BaseLayout.astro';
|
||||
import { getTopicFiles, TopicFileType } from '../lib/topic';
|
||||
import '../styles/prism.css';
|
||||
|
||||
export async function getStaticPaths() {
|
||||
const topicPathMapping = await getTopicFiles();
|
||||
@@ -15,8 +14,7 @@ export async function getStaticPaths() {
|
||||
}
|
||||
|
||||
const { topicId } = Astro.params;
|
||||
const { file, breadcrumbs, roadmapId, roadmap, heading } =
|
||||
Astro.props as TopicFileType;
|
||||
const { file, breadcrumbs, roadmapId, roadmap, heading } = Astro.props as TopicFileType;
|
||||
---
|
||||
|
||||
<BaseLayout
|
||||
@@ -29,9 +27,7 @@ const { file, breadcrumbs, roadmapId, roadmap, heading } =
|
||||
<div class='bg-gray-50'>
|
||||
<Breadcrumbs breadcrumbs={breadcrumbs} roadmapId={roadmapId} />
|
||||
|
||||
<div
|
||||
class='container pb-16 prose prose-p:mt-0 prose-h1:mb-4 prose-h2:mb-3 prose-h2:mt-0'
|
||||
>
|
||||
<div class='container pb-16 prose prose-p:mt-0 prose-h1:mb-4 prose-h2:mb-3 prose-h2:mt-0'>
|
||||
<main id='main-content'>
|
||||
<file.Content />
|
||||
</main>
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
---
|
||||
import CaptchaScripts from '../../components/Captcha/CaptchaScripts.astro';
|
||||
import FAQs from '../../components/FAQs/FAQs.astro';
|
||||
import InteractiveRoadmap from '../../components/InteractiveRoadmap/InteractiveRoadmap.astro';
|
||||
import MarkdownRoadmap from '../../components/MarkdownRoadmap.astro';
|
||||
import RoadmapHeader from '../../components/RoadmapHeader.astro';
|
||||
import UpcomingRoadmap from '../../components/UpcomingRoadmap.astro';
|
||||
import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||
import { generateArticleSchema } from '../../lib/jsonld-schema';
|
||||
import { generateArticleSchema, generateFAQSchema } from '../../lib/jsonld-schema';
|
||||
import { getRoadmapIds, RoadmapFrontmatter } from '../../lib/roadmap';
|
||||
|
||||
export async function getStaticPaths() {
|
||||
@@ -22,20 +23,27 @@ interface Params extends Record<string, string | undefined> {
|
||||
|
||||
const { roadmapId } = Astro.params as Params;
|
||||
const roadmapFile = await import(`../../roadmaps/${roadmapId}/${roadmapId}.md`);
|
||||
const questions = await import(`../../roadmaps/${roadmapId}/faqs.astro`);
|
||||
const { faqs: roadmapFAQs = [] } = await import(`../../roadmaps/${roadmapId}/faqs.astro`);
|
||||
const roadmapData = roadmapFile.frontmatter as RoadmapFrontmatter;
|
||||
|
||||
let articleSchema;
|
||||
let jsonLdSchema = [];
|
||||
|
||||
if (roadmapData.schema) {
|
||||
const roadmapSchema = roadmapData.schema;
|
||||
articleSchema = generateArticleSchema({
|
||||
url: `https://roadmap.sh/${roadmapId}`,
|
||||
headline: roadmapSchema.headline,
|
||||
description: roadmapSchema.description,
|
||||
datePublished: roadmapSchema.datePublished,
|
||||
dateModified: roadmapSchema.dateModified,
|
||||
imageUrl: roadmapSchema.imageUrl,
|
||||
});
|
||||
jsonLdSchema.push(
|
||||
generateArticleSchema({
|
||||
url: `https://roadmap.sh/${roadmapId}`,
|
||||
headline: roadmapSchema.headline,
|
||||
description: roadmapSchema.description,
|
||||
datePublished: roadmapSchema.datePublished,
|
||||
dateModified: roadmapSchema.dateModified,
|
||||
imageUrl: roadmapSchema.imageUrl,
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
if (roadmapFAQs.length) {
|
||||
jsonLdSchema.push(generateFAQSchema(roadmapFAQs));
|
||||
}
|
||||
---
|
||||
|
||||
@@ -46,11 +54,12 @@ if (roadmapData.schema) {
|
||||
keywords={roadmapData.seo.keywords}
|
||||
sponsor={roadmapData.sponsor}
|
||||
noIndex={roadmapData.isUpcoming}
|
||||
jsonLd={articleSchema}
|
||||
jsonLd={jsonLdSchema}
|
||||
>
|
||||
<RoadmapHeader
|
||||
description={roadmapData.description}
|
||||
title={roadmapData.title}
|
||||
description={roadmapData.description}
|
||||
note={roadmapData.note}
|
||||
roadmapId={roadmapId}
|
||||
hasTopics={roadmapData.hasTopics}
|
||||
isUpcoming={roadmapData.isUpcoming}
|
||||
@@ -77,6 +86,7 @@ if (roadmapData.schema) {
|
||||
|
||||
{roadmapData.isUpcoming && <UpcomingRoadmap />}
|
||||
|
||||
<questions.default />
|
||||
<FAQs faqs={roadmapFAQs} />
|
||||
|
||||
<CaptchaScripts slot='after-footer' />
|
||||
</BaseLayout>
|
||||
|
||||
@@ -25,12 +25,13 @@ const { frontmatter: guideData } = guide;
|
||||
title={guideData.seo.title}
|
||||
description={guideData.seo.description}
|
||||
permalink={`/guides/${guideId}/`}
|
||||
canonicalUrl={guideData.canonicalUrl}
|
||||
>
|
||||
<GuideHeader guide={guide} />
|
||||
|
||||
<div class='bg-gray-50 py-5 sm:py-10'>
|
||||
<div
|
||||
class='container prose prose-code:bg-transparent prose-h2:text-3xl prose-h2:mt-4 prose-h2:mb-2 prose-h3:mt-2 prose-img:mt-1'
|
||||
class='container prose-blockquote:font-normal prose prose-code:bg-transparent prose-h2:text-3xl prose-h2:mt-4 prose-h2:mb-2 prose-h3:mt-2 prose-img:mt-1'
|
||||
>
|
||||
<guide.Content />
|
||||
</div>
|
||||
|
||||
@@ -29,3 +29,4 @@ Here is the list of PDF links for each of the roadmaps.
|
||||
* **Java Roadmap** - [Roadmap Link](https://roadmap.sh/java) / [PDF Link](https://roadmap.sh/pdfs/java.pdf)
|
||||
* **Spring Boot Roadmap** - [Roadmap Link](https://roadmap.sh/spring-boot) / [PDF Link](https://roadmap.sh/pdfs/spring-boot.pdf)
|
||||
* **Python Roadmap** - [Roadmap Link](https://roadmap.sh/python) / [PDF Link](https://roadmap.sh/pdfs/python.pdf)
|
||||
* **System Design** - [Roadmap Link](https://roadmap.sh/system-design) / [PDF Link](https://roadmap.sh/pdfs/system-design.pdf)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
# jsonUrl: "/jsons/android.json"
|
||||
# jsonUrl: "/jsons/roadmaps/android.json"
|
||||
pdfUrl: "/pdfs/android.pdf"
|
||||
order: 4
|
||||
featuredTitle: "Android"
|
||||
@@ -7,6 +7,12 @@ featuredDescription: "Step by step guide to becoming an Android Developer in 202
|
||||
title: "Android Developer"
|
||||
description: "Step by step guide to becoming an Android developer in 2023"
|
||||
hasTopics: false
|
||||
schema:
|
||||
headline: "Android Developer Roadmap"
|
||||
description: "Learn how to become a Android Developer with this interactive step by step guide in 2023. We also have resources and short descriptions attached to the roadmap items so you can get everything you want to learn in one place."
|
||||
imageUrl: "https://roadmap.sh/roadmaps/android.png"
|
||||
datePublished: "2023-01-05"
|
||||
dateModified: "2023-01-20"
|
||||
seo:
|
||||
title: "Android Developer Roadmap: Learn to become an Android developer"
|
||||
description: "Community driven, articles, resources, guides, interview questions, quizzes for android development. Learn to become a modern Android developer by following the steps, skills, resources and guides listed in this roadmap."
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
jsonUrl: "/jsons/angular.json"
|
||||
jsonUrl: "/jsons/roadmaps/angular.json"
|
||||
pdfUrl: "/pdfs/angular.pdf"
|
||||
order: 3
|
||||
featuredTitle: "Angular"
|
||||
@@ -10,6 +10,12 @@ hasTopics: true
|
||||
dimensions:
|
||||
width: 968
|
||||
height: 2277.8
|
||||
schema:
|
||||
headline: "Angular Developer Roadmap"
|
||||
description: "Learn how to become a Angular Developer with this interactive step by step guide in 2023. We also have resources and short descriptions attached to the roadmap items so you can get everything you want to learn in one place."
|
||||
imageUrl: "https://roadmap.sh/roadmaps/angular.png"
|
||||
datePublished: "2023-01-05"
|
||||
dateModified: "2023-01-20"
|
||||
seo:
|
||||
title: "Angular Developer Roadmap: Learn to become a Angular developer"
|
||||
description: "Community driven, articles, resources, guides, interview questions, quizzes for angular development. Learn to become a modern Angular developer by following the steps, skills, resources and guides listed in this roadmap."
|
||||
|
||||
@@ -1,16 +1,22 @@
|
||||
---
|
||||
jsonUrl: "/jsons/aspnet-core.json"
|
||||
jsonUrl: "/jsons/roadmaps/aspnet-core.json"
|
||||
pdfUrl: "/pdfs/aspnet-core.pdf"
|
||||
order: 9
|
||||
featuredTitle: "ASP.NET Core"
|
||||
featuredDescription: "Step by step guide to becoming an ASP.NET Core Developer in 2023"
|
||||
title: "ASP.NET Core Developer"
|
||||
description: "Step by step guide to becoming an ASP.NET core developer in 2023"
|
||||
isNew: true
|
||||
isNew: false
|
||||
hasTopics: true
|
||||
dimensions:
|
||||
width: 968
|
||||
height: 2773.45
|
||||
schema:
|
||||
headline: "ASP.NET Core Developer Roadmap"
|
||||
description: "Learn how to become a ASP.NET Core Developer with this interactive step by step guide in 2023. We also have resources and short descriptions attached to the roadmap items so you can get everything you want to learn in one place."
|
||||
imageUrl: "https://roadmap.sh/roadmaps/aspnet-core.png"
|
||||
datePublished: "2023-01-05"
|
||||
dateModified: "2023-01-20"
|
||||
seo:
|
||||
title: "Learn to become a modern ASP.NET core developer"
|
||||
description: "Community driven, articles, resources, guides, interview questions, quizzes for asp.net core development. Learn to become a modern ASP.NET core developer by following the steps, skills, resources and guides listed in this roadmap."
|
||||
|
||||
@@ -5,4 +5,4 @@ C# is a modern coding language that was developed by Microsoft that focuses on a
|
||||
Visit the following resources to learn more:
|
||||
|
||||
- [C# official website?](https://learn.microsoft.com/en-us/dotnet/csharp//)
|
||||
- [The Beginners Guide to C#](https://www.w3schools.com/CS/index.php)
|
||||
- [The Beginners Guide to C#](https://www.w3schools.com/CS/index.php)
|
||||
@@ -1 +1,9 @@
|
||||
# Dotnet
|
||||
# .NET Framework
|
||||
|
||||
.NET (pronounced "dot net") is a software framework developed by Microsoft that can be used to create a wide range of applications, including Windows desktop and web applications, mobile apps, and gaming. The .NET Framework provides a large library of pre-built functionality, including collections, file input/output, and networking, that can be used by .NET applications. It also includes a Common Language Runtime (CLR) which manages the execution of code, providing features such as memory management, security, and exception handling.
|
||||
|
||||
For more information, visit the following link:
|
||||
|
||||
- [What is .NET?](https://dotnet.microsoft.com/en-us/learn/dotnet/what-is-dotnet)
|
||||
- [Intro to .NET](https://www.codecademy.com/article/what-is-net)
|
||||
- [An Overview of .NET](https://auth0.com/blog/what-is-dotnet-platform-overview/)
|
||||
@@ -5,3 +5,9 @@ C# (pronounced "C-sharp") is a general-purpose, object-oriented programming lang
|
||||
C# is a statically-typed language, which means that the type of a variable must be specified when it is declared, and that the type of a value cannot be changed after it has been assigned. C# also supports object-oriented programming, which means that it provides features such as encapsulation, inheritance, and polymorphism.
|
||||
|
||||
C# is a popular language for building .NET applications, and it is used by many large companies and organizations, including Microsoft, Dell, and IBM. It is a versatile language that can be used for a wide range of purposes, and it is well-suited for building scalable and maintainable software systems.
|
||||
|
||||
Visit the following links for more information:
|
||||
|
||||
- [C Sharp Basics](https://www.codecademy.com/catalog/language/c-sharp)
|
||||
- [Introduction to C#](https://learn.microsoft.com/en-us/dotnet/csharp/tour-of-csharp/tutorials/)
|
||||
- [Basics Of C#](https://www.c-sharpcorner.com/UploadFile/e9fdcd/basics-of-C-Sharp/)
|
||||
@@ -7,4 +7,4 @@ Visit the following resources to learn more:
|
||||
- [Learn Git on the command line](https://github.com/jlord/git-it-electron)
|
||||
- [Version Control System Introduction](https://www.youtube.com/watch?v=zbKdDsNNOhg)
|
||||
- [Git & GitHub Crash Course For Beginners](https://www.youtube.com/watch?v=SWYqp7iY_Tc)
|
||||
- [Learn Git in 20 Minutes](https://youtu.be/Y9XZQO1n_7c?t=21)
|
||||
- [Learn Git in 20 Minutes](https://youtu.be/Y9XZQO1n_7c?t=21)
|
||||
@@ -1 +1,16 @@
|
||||
# Azure devops services
|
||||
# Azure Devops Services
|
||||
|
||||
Azure DevOps Services is a collection of services provided by Microsoft that can be used to plan, build, test, and deploy .NET applications. These services can be used together or independently to support various aspects of the software development process. Some of the main services include:
|
||||
|
||||
- Azure Boards: Provides features for agile planning and tracking, such as backlogs, boards, and sprint planning.
|
||||
- Azure Repos: Provides source control management for Git and Team Foundation Version Control (TFVC) repositories.
|
||||
- Azure Artifacts: Provides package management for NuGet, npm, and Maven packages.
|
||||
- Azure Test Plans: Provides support for manual and exploratory testing, as well as continuous testing and testing in production.
|
||||
- Azure Pipeline: Provides a way to build, test, and deploy code automatically, with support for multiple languages and platforms, including .NET.
|
||||
|
||||
These services can be used to create a full-featured development environment that can be used to manage all aspects of a software development project, from planning and design to testing and deployment.
|
||||
|
||||
For more information, visit the following links:
|
||||
|
||||
- [Build, test, and deploy .NET Core apps](https://learn.microsoft.com/en-us/azure/devops/pipelines/ecosystems/dotnet-core?view=azure-devops&tabs=dotnetfive)
|
||||
- [Microsoft Azure DevOps for ASP .NET Core Web apps](https://techmindfactory.com/Microsoft-Azure-DevOps-for-ASP-.NET-Core-Web-apps/)
|
||||
@@ -5,7 +5,7 @@ As the name indicates, a **Data Structure** is a way of organizing the data in t
|
||||
Visit the following resources to learn more:
|
||||
|
||||
- [What are Data Structures?](https://www.geeksforgeeks.org/data-structures)
|
||||
- [ Data Structures and Algorithms](https://www.javatpoint.com/data-structure-tutorial)
|
||||
- [Data Structures and Algorithms](https://www.javatpoint.com/data-structure-tutorial)
|
||||
- [Data Structures Illustrated](https://www.youtube.com/watch?v=9rhT3P1MDHk&list=PLkZYeFmDuaN2-KUIv-mvbjfKszIGJ4FaY)
|
||||
- [C# resources](https://dev.to/adavidoaiei/fundamental-data-structures-and-algorithms-in-c-4ocf)
|
||||
- [Interview Questions about Data Structures](https://www.csharpstar.com/csharp-algorithms/)
|
||||
|
||||
@@ -1 +1,24 @@
|
||||
# General development skills
|
||||
# General development skills
|
||||
|
||||
There are several skills that are generally considered to be important for working with .NET and C#:
|
||||
|
||||
- Object-oriented programming: Understanding the concepts of classes, objects, inheritance, and polymorphism is essential for working with C# and the .NET Framework.
|
||||
|
||||
- C# language: A strong understanding of the C# language, including its syntax, keywords, and built-in classes and types, is necessary for writing efficient and maintainable code.
|
||||
|
||||
- .NET Framework: Familiarity with the .NET Framework, including the Common Language Runtime (CLR) and the Base Class Library (BCL), is important for understanding how C# code is executed and for utilizing the framework's many built-in features.
|
||||
|
||||
- Web & Software development: Knowledge of web development technologies such as HTML, CSS, JavaScript, and ASP.NET is important for creating web applications using C# and the .NET Framework and knowledge of software development methodologies such as Agile, Scrum, or Waterfall is also useful.
|
||||
|
||||
- Database: Familiarity with database concepts and technologies, such as SQL and ADO.NET, is important for working with data in C# applications.
|
||||
|
||||
- Cloud computing: Familiarity with cloud computing concepts and technologies, such as Azure, is becoming increasingly important for deploying and scaling C# applications.
|
||||
|
||||
- DevOps: Understanding of DevOps concepts and practices, such as continuous integration and continuous deployment, is necessary for automating and streamlining the software development process.
|
||||
|
||||
For more information, visit the following links:
|
||||
|
||||
- [A Step-by-Step Approach to Learn OOP](https://www.geeksforgeeks.org/a-step-by-step-approach-to-learn-object-oriented-programming/)
|
||||
- [Asp.net - Complete Tutorial](https://www.youtube.com/watch?v=kdPtNMb8tPw)
|
||||
- [Learn Cloud Computing](https://www.youtube.com/watch?v=eWwK2FKWp0g)
|
||||
- [DevOps Course for Beginners](https://www.youtube.com/watch?v=hQcFE0RD0cQ)
|
||||
@@ -5,3 +5,5 @@ A stored procedure is a pre-compiled collection of SQL statements that can be ex
|
||||
Visit the following resources to learn more:
|
||||
|
||||
- [Stored Procedure Tutorial](https://www.w3schools.com/sql/sql_stored_procedures.asp)
|
||||
- [Stored Procedure in SQL: Benefits And How to Create It](https://www.simplilearn.com/tutorials/sql-tutorial/stored-procedure-in-sql)
|
||||
- [SQL Server stored procedures for beginners](https://www.sqlshack.com/sql-server-stored-procedures-for-beginners/)
|
||||
@@ -5,3 +5,5 @@ Database constraints are rules that are used to limit the data that can be store
|
||||
Visit the following resources to learn more:
|
||||
|
||||
- [SQL Constraints](https://www.w3schools.com/sql/sql_constraints.asp)
|
||||
- [Constraints of SQL](https://www.educative.io/courses/database-design-fundamentals/m7JnY9Xm6Qp)
|
||||
- [Constraints in DBMS](https://beginnersbook.com/2015/04/constraints-in-dbms/)
|
||||
|
||||
@@ -1 +1,14 @@
|
||||
# Triggers
|
||||
# Triggers
|
||||
|
||||
Triggers are special type of stored procedures that are automatically executed in response to specific events that occur within a database. These events can include:
|
||||
|
||||
- Data modification events (INSERT, UPDATE, DELETE) on a specific table or view.
|
||||
- Data definition events (CREATE, ALTER, DROP) on specific database objects such as tables or views.
|
||||
- Logon events (CONNECT, DISCONNECT) that occur when a user connects to or disconnects from the database.
|
||||
|
||||
For more information, visit the following links:
|
||||
|
||||
- [Database Triggers](https://docs.oracle.com/cd/A57673_01/DOC/server/doc/SCN73/ch15.htm)
|
||||
- [Database Triggers: Examples & Overview](https://study.com/academy/lesson/database-triggers-examples-overview.html)
|
||||
- [What are Triggers in SQL?](https://www.edureka.co/blog/triggers-in-sql/)
|
||||
- [What is a SQL Trigger?](https://www.essentialsql.com/sql-trigger/)
|
||||
@@ -9,3 +9,5 @@ MVC is an architectural design pattern used for developing applications, specifi
|
||||
Visit the following resources to learn more:
|
||||
|
||||
- [MVC Official Documentation](https://learn.microsoft.com/en-us/aspnet/core/mvc/overview?WT.mc_id=dotnet-35129-website&view=aspnetcore-7.0)
|
||||
- [ASP.NET MVC Architecture](https://www.tutorialsteacher.com/mvc/mvc-architecture)
|
||||
- [MVC Framework - Introduction](https://www.tutorialspoint.com/mvc_framework/mvc_framework_introduction.htm)
|
||||
@@ -1 +1,9 @@
|
||||
# Rest
|
||||
# REST
|
||||
|
||||
REST (Representational State Transfer) is an architectural style for building web services. In the context of .NET, RESTful web services can be created using the ASP.NET Web API framework, which allows developers to create HTTP-based services that can be consumed by a wide range of clients, including web browsers and mobile devices. The Web API framework provides a set of tools and libraries for creating RESTful services, including routing, request/response handling, and support for a variety of data formats, such as JSON and XML.
|
||||
|
||||
For more information, visit the following resources:
|
||||
|
||||
- [What is REST Services?](http://www.codedigest.com/quick-start/16/what-is-rest-services-how-to-create-rest-services-in-aspnet)
|
||||
- [Restful API In ASP.NET: Introduction of REST & Web API](https://www.c-sharpcorner.com/UploadFile/4b0136/restful-api-in-Asp-Net-introduction-of-rest-web-api/)
|
||||
- [What are RESTful APIs](https://www.pragimtech.com/blog/blazor/what-are-restful-apis/)
|
||||
@@ -1 +1,11 @@
|
||||
# Razor pages
|
||||
# Razor Pages
|
||||
|
||||
Razor Pages is a feature of the ASP.NET Core framework that allows developers to build web applications using a combination of Razor markup (a markup syntax for defining dynamic HTML) and C# code. Razor Pages is built on top of the ASP.NET Core MVC (Model-View-Controller) framework, and provides a simpler, more intuitive way to build web pages and handle user input.
|
||||
|
||||
Razor Pages are useful for building simple, self-contained web pages that do not require a complex navigation or layout structure, and are often used for building small to medium-size web applications.
|
||||
|
||||
For more information, visit the following links:
|
||||
|
||||
- [Basics of Razor Pagess](https://www.jetbrains.com/dotnet/guide/tutorials/basics/razor-pages/)
|
||||
- [Get started with Razor Pages in ASP.NET Core](https://learn.microsoft.com/en-us/aspnet/core/tutorials/razor-pages/?view=aspnetcore-7.0)
|
||||
- [What Is Razor Pages?](https://www.learnrazorpages.com/)
|
||||
@@ -1 +1,11 @@
|
||||
# Razor components
|
||||
# Razor Components
|
||||
|
||||
Razor Components is a feature of ASP.NET Core that allows developers to build reusable, self-contained components that can be used across multiple pages or even multiple applications. Razor Components is built on top of the Razor view engine, which allows developers to define components using a combination of Razor markup and C# code.
|
||||
|
||||
Razor Components are useful for building complex, dynamic, and reusable UI elements, such as forms, tables, or dialogs, and can be used to build both small and large-scale web applications.
|
||||
|
||||
For more information, vist the following links:
|
||||
|
||||
- [ASP.NET Core Razor components](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/?view=aspnetcore-7.0)
|
||||
- [What is Core razor components?](https://www.youtube.com/watch?v=KseDLejhYi0)
|
||||
- [Core Razor Componets in .NET](https://www.c-sharpcorner.com/blogs/asp-net-core-razor-componets)
|
||||
@@ -1 +1,11 @@
|
||||
# Middlewares
|
||||
# Middlewares
|
||||
|
||||
Middleware is software that sits between an operating system and application software, and facilitates communication and data exchange between them. In the context of web development, middleware refers to software components that handle requests and responses in a web application. These components are typically executed in a pipeline, with each component performing a specific task, such as authentication, logging, or routing.
|
||||
|
||||
In the ASP.NET Core framework, middleware is a key concept that is used to build web applications. Middleware components are added to the application pipeline using the `IApplicationBuilder` interface, and are executed in the order in which they are added. For example, an application might have middleware components for handling authentication, logging, and routing, in that order.
|
||||
|
||||
Visit the following links for more resources:
|
||||
|
||||
- [What is Middleware?](https://www.redhat.com/en/topics/middleware/what-is-middleware)
|
||||
- [Introduction to Middleware](https://www.techtarget.com/searchapparchitecture/definition/middleware)
|
||||
- [What is Middleware in .NET?](https://www.talend.com/resources/what-is-middleware/)
|
||||
@@ -1 +1,7 @@
|
||||
# Filters and attributes
|
||||
# Filters and Attributes
|
||||
|
||||
In the ASP.NET Core framework, filters and attributes are used to add additional functionality to controllers and action methods, such as authentication, authorization, caching, and exception handling.
|
||||
|
||||
- **Filters** are classes that implement one or more of the filter interfaces provided by the framework, such as `IActionFilter`, `IResultFilter`, `IExceptionFilter`, and `IAuthorizationFilter`. Filters can be applied to controllers, action methods, or globally to the entire application. They can be used to perform tasks such as logging, caching, and handling exceptions.
|
||||
|
||||
- **Attributes** are classes that derive from `Attribute` class, and are used to decorate controllers, action methods, or properties with additional metadata. For example, the Authorize attribute can be used to require that a user is authenticated before accessing a specific action method, and the `ValidateAntiForgeryToken` attribute can be used to protect against cross-site request forgery (CSRF) attacks.
|
||||
@@ -1 +1,13 @@
|
||||
# App settings and configurations
|
||||
# App Settings and Configurations
|
||||
|
||||
In the ASP.NET Core framework, app settings and configurations refer to the process of storing and managing application-specific settings and configuration data.
|
||||
|
||||
- **App Settings** refers to the key-value pairs of data that an application uses to configure its behavior, such as database connection strings, api keys, or other settings. These settings are typically stored in configuration files, such as `appsettings.json`, `appsettings.development.json`, or `appsettings.production.json`, and can be accessed using the IConfiguration interface.
|
||||
|
||||
- **Configurations** refer to the process of loading and managing the app settings, including specifying the source of the settings and the format of the configuration files. In ASP.NET Core, the `Startup` class is responsible for configuring the application's settings, and typically loads configuration data from various sources, such as JSON files, environment variables, or command-line arguments.
|
||||
|
||||
For more information, visit the following links:
|
||||
|
||||
- [What is Azure App Configuration?](https://learn.microsoft.com/en-us/azure/azure-app-configuration/overview)
|
||||
- [What are App Configurations and how do I work with them?](https://support.procore.com/faq/what-are-app-configurations)
|
||||
- [Configuration & AppSettings](https://docs.servicestack.net/appsettings)
|
||||
@@ -1 +1,9 @@
|
||||
# Basics of aspnet core
|
||||
# Basics of ASP.NET Core
|
||||
|
||||
ASP.NET Core is a open-source, cross-platform web framework for building modern web applications using .NET. Some of the basics of ASP.NET Core are Cross-platform, Open-source, Modular, High performance, MVC pattern, Dependency Injection, Middleware, Razor Pages and Razor Components, EF Core.
|
||||
|
||||
For more information, visit the following resources:
|
||||
|
||||
- [ASP.NET documentation](https://learn.microsoft.com/en-us/aspnet/core/?view=aspnetcore-7.0)
|
||||
- [ASP.NET Core Tutorial](https://www.tutorialspoint.com/asp.net_core/index.htm)
|
||||
- [Learn ASP.NET Core from Scratch](https://www.tutorialsteacher.com/core)
|
||||
@@ -1 +1,12 @@
|
||||
# Framework basics
|
||||
# Framework Basics
|
||||
|
||||
An ORM (Object-Relational Mapping) framework is a tool that maps the objects in an application to the database tables, allowing developers to work with the database using familiar, object-oriented concepts.
|
||||
|
||||
ORM frameworks are tools that map the objects in an application to the database tables, allowing developers to work with the database using familiar, object-oriented concepts such as Entities, Mapping, Context, Queries, Lazy Loading, Change Tracking, and Caching.
|
||||
|
||||
For more resources, visit the following link:
|
||||
|
||||
- [ORM Framework](https://www.h2kinfosys.com/blog/orm-framework/)
|
||||
- [What are Frameworks in ORM](https://www.killerphp.com/articles/what-are-orm-frameworks/)
|
||||
- [Essentials of ORM Framework](https://medium.com/@mikependon/the-essentials-of-orm-framework-in-your-software-development-837131efd91b)
|
||||
- [ORM Frameworks – What is an Object-Relational Mapping Framework](https://onlinecode.org/what-are-orm-frameworks/)
|
||||
@@ -7,3 +7,5 @@ To use Code First Migrations, you need to enable it in your Entity Framework app
|
||||
Once Migrations is enabled, you can use the Package Manager Console to add a new migration to your application. This will generate a class that contains the necessary SQL commands to update the database schema. You can then use the Update-Database command to apply the migration to the database.
|
||||
|
||||
- [What is a Code First Migration?](https://www.entityframeworktutorial.net/code-first/what-is-code-first.aspx)
|
||||
- [Example for Code First Migrations](https://learn.microsoft.com/en-us/ef/ef6/modeling/code-first/migrations/)
|
||||
- [Code First Migrations in Entity Framework](https://www.c-sharpcorner.com/UploadFile/26b237/code-first-migrations-in-entity-framework/)
|
||||
|
||||
@@ -1 +1,12 @@
|
||||
# Change tracker api
|
||||
# Change Tracker API
|
||||
|
||||
The Change Tracker API is a feature of ORM (Object-Relational Mapping) frameworks, such as Entity Framework Core, that allows developers to track changes to entities and automatically persist them to the database.
|
||||
|
||||
The Change Tracker API is typically exposed through the context class, which is the main class that manages the connection to the database and provides access to the entities.
|
||||
|
||||
When an entity is retrieved from the database, the Change Tracker API marks it as "unchanged". When a property of the entity is modified, the Change Tracker API marks the entity as "modified". And when a new entity is added to the context, the Change Tracker API marks it as "added".
|
||||
For more resources, visit the following links:
|
||||
|
||||
- [Change Tracking in EF Core](https://learn.microsoft.com/en-us/ef/core/change-tracking/)
|
||||
- [Intro to Change Tracking](https://www.oreilly.com/library/view/programming-entity-framework/9781449331825/ch05.html)
|
||||
- [ChangeTracker in Entity Framework Core](https://www.entityframeworktutorial.net/efcore/changetracker-in-ef-core.aspxs)
|
||||
@@ -1 +1,15 @@
|
||||
# Lazy eager explicit loading
|
||||
# Lazy Eager Explicit Loading
|
||||
|
||||
## Eager Loading
|
||||
|
||||
Eager Loading helps you to load all your needed entities at once; i.e., all your child entities will be loaded at single database call. This can be achieved, using the Include method, which returs the related entities as a part of the query and a large amount of data is loaded at once.
|
||||
|
||||
## Lazy Loading
|
||||
|
||||
It is the default behavior of an Entity Framework, where a child entity is loaded only when it is accessed for the first time. It simply delays the loading of the related data, until you ask for it.
|
||||
|
||||
Visit the following links for more resources:
|
||||
|
||||
- [Eager Loading & Lazy Loading](https://www.c-sharpcorner.com/article/eager-loading-lazy-loading-and-explicit-loading-in-entity-framework/)
|
||||
- [Difference between Eager and Lazy Loading](https://stackoverflow.com/questions/31366236/lazy-loading-vs-eager-loading)
|
||||
- [Working With Lazy & Eager Loading in Entity Framework](https://dzone.com/articles/working-with-lazy-loading-and-eager-loading-in-ent)
|
||||
@@ -1 +1,9 @@
|
||||
# Entity framework core
|
||||
# Entity Framework Core
|
||||
|
||||
Entity Framework Core (EF Core) is an open-source Object-Relational Mapping (ORM) framework for .NET. It is a lightweight, cross-platform version of Entity Framework, the ORM framework that was part of the .NET Framework. EF Core allows developers to work with relational data using domain-specific objects, eliminating the need to write raw SQL statements. Instead, EF Core provides a set of APIs that can be used to interact with a database, providing a simple and efficient way to perform common database operations such as querying, inserting, updating, and deleting data.
|
||||
|
||||
For more information, visit the following links:
|
||||
|
||||
- [Example of Entity Framework Core](https://learn.microsoft.com/en-us/ef/core/)
|
||||
- [Entity Framework Core Documentation](https://learn.microsoft.com/en-us/ef/)
|
||||
- [What are the Basics of Entity Framework Core?](https://www.jetbrains.com/dotnet/guide/tutorials/basics/entity-framework-core/)
|
||||
@@ -1 +1,11 @@
|
||||
# Repodb
|
||||
# RepoDB
|
||||
|
||||
RepoDB is an open-source ORM (Object-Relational Mapping) library for .NET that simplifies the process of working with databases. It is a lightweight, fast, and easy-to-use library that provides a simple and consistent API for performing common database operations such as querying, inserting, updating, and deleting data.
|
||||
|
||||
RepoDb is built on top of ADO.NET, which is the native data access technology in .NET, and provides a higher-level abstraction on top of it. This allows RepoDb to take advantage of the performance and scalability of ADO.NET while providing a simpler and more convenient API for developers.
|
||||
|
||||
For more information, visit the following links:
|
||||
|
||||
- [Get Started with RepoDB](https://repodb.net/)
|
||||
- [Complete Guide to RepoDB](https://medium.com/nerd-for-tech/everything-you-need-to-know-about-repodb-23cd4b9939c1)
|
||||
- [Why Choose RepoDB?](https://blog.devgenius.io/why-choose-repodb-orm-over-dapper-da87432c7830)
|
||||
@@ -1 +1,11 @@
|
||||
# Nhibernate
|
||||
# NHibernate
|
||||
|
||||
NHibernate is an open-source Object-Relational Mapping (ORM) framework for .NET. It is a powerful and flexible framework that can greatly simplify working with relational data in .NET. NHibernate is similar to other ORM frameworks such as Entity Framework and RepoDb in that it provides a higher-level abstraction on top of the underlying data access technology (ADO.NET in this case) and allows developers to work with data using domain-specific objects, eliminating the need to write raw SQL statements.
|
||||
|
||||
NHibernate uses the concept of "mapping files" which are XML files that define how the classes in the application map to the tables and columns in the database. These mapping files are used to create a conceptual model of the data in the form of classes, and then NHibernate uses this model to generate the SQL statements necessary to interact with the database.
|
||||
|
||||
For more information, visit the following links:
|
||||
|
||||
- [What is Nhibernate?](https://www.partech.nl/en/publications/2021/08/what-is-nhibernate-and-how-is-it-different-from-entity-framework)
|
||||
- [NHibernate - ORM](https://www.tutorialspoint.com/nhibernate/nhibernate_orm.htm)
|
||||
- [Get Started with NHibernate](https://nhibernate.info/)
|
||||
@@ -5,3 +5,5 @@ ORM stands for Object-Relational Mapping, and it is a technique that allows a de
|
||||
Visit the following resources to learn more:
|
||||
|
||||
- [ORM (Object Relational Mapping)](https://www.telerik.com/blogs/dotnet-basics-orm-object-relational-mapping)
|
||||
- [What is an ORM – The Meaning of Object Relational Mapping](https://www.freecodecamp.org/news/what-is-an-orm-the-meaning-of-object-relational-mapping-database-tools/)
|
||||
- [Understanding Object-Relational Mapping: Pros, Cons](https://www.altexsoft.com/blog/object-relational-mapping/)
|
||||
|
||||
@@ -1 +1,10 @@
|
||||
# Scrutor
|
||||
# Scrutor
|
||||
|
||||
Scrutor is an open-source library for .NET that extends the functionality of the built-in dependency injection framework in .NET Core. It provides a set of extension methods for the `IServiceCollection` interface, which can be used to register and configure services in a more convenient and flexible way.
|
||||
|
||||
One of the main features of Scrutor is its ability to automatically scan assemblies for services and register them with the dependency injection container, allowing you to avoid having to manually register each service one by one. It also provides a fluent API that makes it easy to configure services, such as specifying the lifetime of a service, adding decorators, and more.
|
||||
|
||||
For more information, visit the following resources:
|
||||
|
||||
- [How to use Scrutor in ASP.Net Core?](https://www.infoworld.com/article/3321356/how-to-use-scrutor-in-aspnet-core.html)
|
||||
- [Complete Guide to Scrutor](https://andrewlock.net/using-scrutor-to-automatically-register-your-services-with-the-asp-net-core-di-container/)
|
||||
@@ -1 +1,11 @@
|
||||
# Microsoft extensions dependency injection
|
||||
# Microsoft Extensions Dependency Injection
|
||||
|
||||
Microsoft.Extensions.DependencyInjection is a dependency injection framework that is part of the Microsoft.Extensions.DependencyInjection NuGet package. It is used to create and manage instances of objects and their dependencies, and is particularly useful for implementing the Dependency Inversion Principle in .NET applications.
|
||||
|
||||
The package provides a simple and consistent API for registering services and resolving dependencies, which can be used to configure and manage the lifetime of objects in an application. It also provides built-in support for various types of service lifetime, such as transient, singleton and scoped.
|
||||
|
||||
For more information, visit the following links:
|
||||
|
||||
- [Guide to Microsoft Extensions Dependency Injection](https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.dependencyinjection?view=dotnet-plat-ext-7.0)
|
||||
- [Exploring the Microsoft.Extensions.DependencyInjection](https://www.codeproject.com/Articles/5339241/Exploring-the-Microsoft-Extensions-DependencyInjec)
|
||||
- [How to use Microsoft.Extensions.DependencyInjection](https://stackoverflow.com/questions/53825155/how-can-i-use-microsoft-extensions-dependencyinjection-in-an-net-core-console-a)
|
||||
@@ -1 +1,11 @@
|
||||
# Auto fac
|
||||
# Autofac
|
||||
|
||||
Autofac is an open-source dependency injection framework for .NET. It is designed to make it easier to manage the dependencies of an application by automatically resolving and managing the lifetime of objects and their dependencies.
|
||||
|
||||
Autofac uses a technique called "component registration" to define the objects and dependencies of an application. This is done by creating instances of the `ContainerBuilder` class and using its methods to register types, instances and factories. Then, the `Build()` method is called to create an instance of the `IContainer` interface, which can be used to resolve dependencies throughout the application.
|
||||
|
||||
Visit the following resources for more information:
|
||||
|
||||
- [Autofac’s Documentation](https://autofac.readthedocs.io/en/latest/)
|
||||
- [Getting started with Autofac](https://autofac.org/)
|
||||
- [Dependency Injection with Autofac](https://www.codeproject.com/Articles/25380/Dependency-Injection-with-Autofac)
|
||||
@@ -1 +1,11 @@
|
||||
# Ninject
|
||||
# Ninject
|
||||
|
||||
Ninject is an open-source dependency injection framework for .NET. It is designed to make it easier to manage the dependencies of an application by automatically resolving and managing the lifetime of objects and their dependencies.
|
||||
|
||||
Ninject uses a technique called "binding" to define the objects and dependencies of an application. This is done by creating instances of the `StandardKernel` class and using its methods to register types, instances and factories. Then, the `Get()` method is called to resolve the dependencies throughout the application.
|
||||
|
||||
For more information, visit the following resources:
|
||||
|
||||
- [Intro to Ninject](http://www.ninject.org/)
|
||||
- [What is Ninject and when do you use it?](https://stackoverflow.com/questions/17375234/what-is-ninject-and-when-do-you-use-it)
|
||||
- [How to use NInject?](https://www.infoworld.com/article/3191648/how-to-implement-di-in-webapi-using-ninject.html)
|
||||
@@ -1 +1,11 @@
|
||||
# Castle windsor
|
||||
# Castle Windsor
|
||||
|
||||
Castle Windsor is an open-source dependency injection framework for .NET. It is designed to make it easier to manage the dependencies of an application by automatically resolving and managing the lifetime of objects and their dependencies.
|
||||
|
||||
Castle Windsor uses a technique called "registration" to define the objects and dependencies of an application. This is done by creating instances of the `WindsorContainer` class and using its methods to register types, instances and factories. Then, the `Resolve()` method is called to resolve the dependencies throughout the application.
|
||||
|
||||
Visit the following links for more resources:
|
||||
|
||||
- [Getting Started with Dependency Injection Using Castle Windsor](https://www.codementor.io/@copperstarconsulting/getting-started-with-dependency-injection-using-castle-windsor-4meqzcsvh)
|
||||
- [What is Castle Windsor?](https://stackoverflow.com/questions/124871/what-is-castle-windsor-and-why-should-i-care)
|
||||
- [Intro to Castle Windsor](http://www.castleproject.org/projects/windsor/)
|
||||
@@ -1 +1,11 @@
|
||||
# Simple injector
|
||||
# Simple Injector
|
||||
|
||||
Simple Injector is an open-source dependency injection framework for .NET. It is designed to make it easy to manage the dependencies of an application by automatically resolving and managing the lifetime of objects and their dependencies.
|
||||
|
||||
Simple Injector uses a technique called "registration" to define the objects and dependencies of an application. This is done by creating an instance of the `Container` class and using its methods to register types, instances and factories. Then, the `GetInstance()` method is called to resolve the dependencies throughout the application.
|
||||
|
||||
For more information, visit the following resources:
|
||||
|
||||
- [How to use Simple Injector?](https://www.infoworld.com/article/3636242/how-to-use-simple-injector-in-aspnet-core-mvc.html)
|
||||
- [Simple Injector's Documentation](https://docs.simpleinjector.org/en/latest/)
|
||||
- [Example of Dependency Injection Using Simple Injector](https://www.c-sharpcorner.com/UploadFile/4d9083/dependency-injection-using-simple-injector/)
|
||||
@@ -1 +1,11 @@
|
||||
# Di containers
|
||||
# DI Containers
|
||||
|
||||
A dependency injection (DI) container is a software component that is responsible for managing the dependencies of an application. It is used to create and manage instances of objects and their dependencies, and is particularly useful for implementing the Dependency Inversion Principle in software development.
|
||||
|
||||
A DI container typically consists of two main parts: a configuration API, which is used to register the types and their dependencies, and a resolution API, which is used to retrieve instances of the registered types. The DI container automatically resolves the dependencies of the objects it creates, and manages the lifetime of the objects and their dependencies.
|
||||
|
||||
For more information, visit the following links:
|
||||
|
||||
- [What is DI Container?](https://www.dotnettricks.com/learn/dependencyinjection/what-is-ioc-container-or-di-container)
|
||||
- [Getting Started with DI Container](https://stackoverflow.com/questions/50718586/what-is-a-di-container)
|
||||
- [How to Use DI Container?](https://learn.userfrosting.com/services/the-di-container)
|
||||
@@ -1 +1,10 @@
|
||||
# Scoped
|
||||
# Scoped
|
||||
|
||||
Scoped lifetime is a type of dependency injection that creates a new instance of an object for each unique request, but reuses the same instance for the same request. This means that if multiple components within the same request depend on the same service, they will all receive the same instance. However, if another request is made, a new instance of the service will be created for that request.
|
||||
|
||||
Scoped lifetime is useful when you have services that are specific to a given request, such as a request-scoped database context. This allows you to have a separate and isolated instance of a service for each unique request, which can help to prevent cross-request contamination of data and improve performance.
|
||||
|
||||
For more information, visit the following resources:
|
||||
|
||||
- [Dependency Injection - What is Scope?](https://javaranch.com/journal/2008/10/dependency-injection-what-is-scope.html)
|
||||
- [Effective Dependency Injection Scoping](https://medium.com/android-news/effective-dependency-injection-scoping-4bac813d4491)
|
||||
@@ -1 +1,11 @@
|
||||
# Transient
|
||||
# Transient
|
||||
|
||||
Transient lifetime is a type of dependency injection that creates a new instance of an object each time it is requested. This means that if multiple components within the same request or across different requests depend on the same service, they will each receive a new instance of the service.
|
||||
|
||||
Transient lifetime is useful when you have services that are stateless and do not need to maintain any data between requests, such as a service that performs a simple calculation or returns data from a database.
|
||||
|
||||
For more information:
|
||||
|
||||
- [What are Transient Dependencies?](https://blazor-university.com/dependency-injection/dependency-lifetimes-and-scopes/transient-dependencies/)
|
||||
- [Dependency Injection Lifetime](https://www.tektutorialshub.com/asp-net-core/asp-net-core-dependency-injection-lifetime/)
|
||||
- [Dependency Injection Explained with Transient](https://www.youtube.com/watch?v=NkTF_6IQPiY)
|
||||
@@ -1 +1,11 @@
|
||||
# Singleton
|
||||
# Singleton
|
||||
|
||||
Singleton lifetime is a type of dependency injection that creates a single instance of an object and reuses it throughout the lifetime of the application. This means that if multiple components within the same request or across different requests depend on the same service, they will all receive the same instance of the service.
|
||||
|
||||
Singleton lifetime is useful when you have services that need to maintain state or shared data across requests, such as a service that caches data or maintains a connection to a resource.
|
||||
|
||||
For more information:
|
||||
|
||||
- [What are Singleton Dependencies?](https://blazor-university.com/dependency-injection/dependency-lifetimes-and-scopes/transient-dependencies/)
|
||||
- [Dependency Injection Lifetime](https://www.tektutorialshub.com/asp-net-core/asp-net-core-dependency-injection-lifetime/)
|
||||
- [Dependency Injection Explained with Singleton](https://www.youtube.com/watch?v=NkTF_6IQPiY)
|
||||
@@ -1 +1,15 @@
|
||||
# Life cycles
|
||||
# Life Cycles
|
||||
|
||||
In ASP.NET, dependency injection (DI) lifecycles determine the lifetime of objects that are resolved through the DI container. There are several predefined lifecycle options in the `Microsoft.Extensions.DependencyInjection` library, including:
|
||||
|
||||
- **Transient:** A new instance of the object is created every time it is requested.
|
||||
- **Scoped:** A new instance of the object is created for each request within the same scope.
|
||||
- **Singleton:** A single instance of the object is created and shared across the entire application.
|
||||
|
||||
Additionally, you can also create a custom lifecycle by implementing the `Microsoft.Extensions.DependencyInjection.IServiceScopeFactory` interface
|
||||
|
||||
For more resources, visit the following links:
|
||||
|
||||
- [Complete Guide to Dependency Injection Lifecycles](https://www.youtube.com/watch?v=wA5bPsv2CLA)
|
||||
- [What are Service Life Cyles in ASP.NET Core?](https://endjin.com/blog/2022/09/service-lifetimes-in-aspnet-core)
|
||||
- [Learn Service Lifetimes in .NET Core](https://henriquesd.medium.com/dependency-injection-and-service-lifetimes-in-net-core-ab9189349420)
|
||||
@@ -1 +1,12 @@
|
||||
# Dependency injection
|
||||
# Dependency Injection
|
||||
|
||||
Dependency injection (DI) is a software design pattern that is used to manage the dependencies of an application. It is a technique that allows developers to write loosely-coupled code, by separating the responsibility of creating and managing objects from the objects themselves.
|
||||
|
||||
In a typical implementation, a DI container is used to manage the dependencies of the application. The container is responsible for creating and managing instances of objects and their dependencies, and providing them to other objects as needed.
|
||||
|
||||
There are different types of dependency injection, such as Constructor injection, Property injection, and Method injection, which can be used depending on the requirement and the design of the application.
|
||||
Visit the following links for more resources:
|
||||
|
||||
- [What is Dependency Injection?](https://stackoverflow.com/questions/130794/what-is-dependency-injection)
|
||||
- [Dependency Injection, It's Definition & principles](https://www.growin.com/blog/what-is-dependency-injection/)
|
||||
- [Intro to Dependency Injections](https://www.freecodecamp.org/news/a-quick-intro-to-dependency-injection-what-it-is-and-when-to-use-it-7578c84fa88f/)
|
||||
@@ -1,8 +1,9 @@
|
||||
# Memory cache
|
||||
# Memory Cache
|
||||
|
||||
Memory caching (often simply referred to as caching) is a technique in which computer applications temporarily store data in a computer’s main memory (i.e., random access memory, or RAM) to enable fast retrievals of that data. The RAM that is used for the temporary storage is known as the cache.
|
||||
|
||||
Visit the following resources to learn more:
|
||||
|
||||
- [Cache in-memory in ASP.NET Core](https://learn.microsoft.com/en-us/aspnet/core/performance/caching/memory?view=aspnetcore-7.0)
|
||||
- [Intro to In-Memory Caching in C#](https://www.youtube.com/watch?v=2jj2wH60QuE)
|
||||
- [Intro to In-Memory Caching in C#](https://www.youtube.com/watch?v=2jj2wH60QuE)
|
||||
- [What is Memory Caching?](https://hazelcast.com/glossary/memory-caching/)
|
||||
@@ -1,4 +1,4 @@
|
||||
# Entity framework cache
|
||||
# Entity Framework Cache
|
||||
|
||||
Entity Framework Core(EF Core) is a cross-platform version of the popular Entity Framework data access technology that is lightweight, extendable, and open source.
|
||||
It can be used as an object-relational mapper (O/RM), which can Allow .NET developers to use .NET objects to interact with a database and Removes the requirement for most of the data-access code that is generally required.
|
||||
@@ -8,4 +8,5 @@ However, during peak loads, high-transaction .NET Core apps using EF Core have p
|
||||
Visit the following resources to learn more:
|
||||
|
||||
- [Entity Framework 2nd Level Cache](https://www.gridgain.com/docs/latest/developers-guide/net-specific/net-entity-framework-cache)
|
||||
- [What is Entity Framework](https://www.youtube.com/watch?v=Z7713GBhi4k)
|
||||
- [What is Entity Framework?](https://www.youtube.com/watch?v=Z7713GBhi4k)
|
||||
- [Caching In Entity Framework](https://www.c-sharpcorner.com/article/caching-in-entity-framework-ef-core-using-ncache/)
|
||||
@@ -5,4 +5,5 @@ Memcached is an open-source, high-performance, distributed memory object caching
|
||||
Visit the following resources to learn more:
|
||||
|
||||
- [Using Memcached as Distributed Cache in .NET Core](https://dotnetcorecentral.com/blog/using-memcached-as-distributed-cache-in-net-core/)
|
||||
- [Memcached as Distributed Cache in .Net Core Application](https://www.youtube.com/watch?v=yQ8Kwx9M_Hg)
|
||||
- [Memcached as Distributed Cache in .Net Core Application](https://www.youtube.com/watch?v=yQ8Kwx9M_Hg)
|
||||
- [Intro to Memcached](https://memcached.org/)
|
||||
@@ -1,4 +1,4 @@
|
||||
# Easy caching
|
||||
# Easy Caching
|
||||
|
||||
EasyCaching is an open-source caching library that contains basic usages and some advanced usages of caching which can help us to handle caching more easily.
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Redis
|
||||
|
||||
Redis is an open source (BSD licensed), in-memory data structure store used as a database, cache, message broker, and streaming engine. Redis provides data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes, and streams. Redis has built-in replication, Lua scripting, LRU eviction, transactions, and various levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster.
|
||||
Redis is an open source (BSD licensed) which is an in-memory data structure store used as a database, cache, message broker, and streaming engine. Redis provides data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes, and streams. Redis has built-in replication, Lua scripting, LRU eviction, transactions, and various levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster.
|
||||
|
||||
You can use Redis in many programming languages. It is such a popular and widely used cache that Microsoft Azure also provides its cloud-based version with the name Azure Cache for Redis.
|
||||
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
# Stackexchange redis
|
||||
# Stackexchange Redis
|
||||
|
||||
StackExchange.Redis is a high performance general purpose redis client for .NET languages (C#, etc.). It is the logical successor to BookSleeve, and is the client developed-by (and used-by) Stack Exchange for busy sites like Stack Overflow.
|
||||
|
||||
Visit the following resources to learn more:
|
||||
|
||||
- [Using StackExchange.Redis with .NET](https://docs.redis.com/latest/rs/references/client_references/client_csharp/)
|
||||
- [Introduction to StackExchange.Redis](https://www.youtube.com/watch?v=rsXvpCHdldg)
|
||||
- [Introduction to StackExchange.Redis](https://www.youtube.com/watch?v=rsXvpCHdldg)
|
||||
- [Getting Started with Stackexchange Redis](https://stackexchange.github.io/StackExchange.Redis/)
|
||||
@@ -1,8 +1,9 @@
|
||||
# Distributed cache
|
||||
# Distributed Cache
|
||||
|
||||
A distributed cache is a cache shared by multiple app servers, typically maintained as an external service to the app servers that access it. A distributed cache can improve the performance and scalability of an ASP.NET Core app, especially when the app is hosted by a cloud service or a server farm.
|
||||
|
||||
Visit the following resources to learn more:
|
||||
|
||||
- [Distributed caching in ASP.NET Core](https://learn.microsoft.com/en-us/aspnet/core/performance/caching/distributed?view=aspnetcore-7.0)
|
||||
- [Distributed Caching In ASP.NET Core With Redis](https://www.youtube.com/watch?v=Tt5zIKVMMbs)
|
||||
- [Distributed Caching In ASP.NET Core With Redis](https://www.youtube.com/watch?v=Tt5zIKVMMbs)
|
||||
- [What is a Distributed Cached?](https://hazelcast.com/glossary/distributed-cache/)
|
||||
@@ -5,4 +5,5 @@ Caching is a technique of storing frequently used data or information in a local
|
||||
Visit the following resources to learn more:
|
||||
|
||||
- [Caching in ASP.Net](https://www.c-sharpcorner.com/UploadFile/2072a9/caching-in-Asp-Net/)
|
||||
- [Overview of caching in ASP.NET Core](https://learn.microsoft.com/en-us/aspnet/core/performance/caching/overview?view=aspnetcore-7.0)
|
||||
- [Overview of caching in ASP.NET Core](https://learn.microsoft.com/en-us/aspnet/core/performance/caching/overview?view=aspnetcore-7.0)
|
||||
- [Intro to Data Caching in ASP.NET](https://www.tutorialspoint.com/asp.net/asp.net_data_caching.htm)
|
||||
@@ -1 +1,10 @@
|
||||
# Elasticsearch
|
||||
# Elasticsearch
|
||||
|
||||
Elasticsearch is a distributed, open-source search and analytics engine that can be used to index, search, and analyze large volumes of data quickly and in near real-time. It is built on top of the Apache Lucene library and can be used to perform full-text search, faceted search, and geospatial search, among other things.
|
||||
|
||||
In an ASP.NET application, Elasticsearch can be integrated as a search engine to provide advanced search functionality to the application. There are several libraries available for integrating Elasticsearch with an ASP.NET application, such as Nest and Elasticsearch.Net. These libraries provide a .NET client for Elasticsearch, which can be used to interact with the Elasticsearch engine from within an ASP.NET application.
|
||||
To learn more, visit the following resources:
|
||||
|
||||
- [Elasticsearch in ASP.NET Core](https://code-maze.com/elasticsearch-aspnet-core/)
|
||||
- [An Elasticsearch Tutorial for .NET Developers](https://www.toptal.com/dot-net/elasticsearch-dot-net-developers)
|
||||
- [How to integrate ElasticSearch in ASP.NET?](https://blexin.com/en/blog-en/how-to-integrate-elasticsearch-in-asp-net-core/)
|
||||
@@ -1 +1,11 @@
|
||||
# Solr
|
||||
# Solr
|
||||
|
||||
Apache Solr is a search engine platform based on the Apache Lucene library. It is a standalone enterprise search server that provides a REST-like API for indexing, searching, and updating documents. Solr can be used to perform full-text search, faceted search, and geospatial search, among other things.
|
||||
|
||||
Solr can be useful in ASP.NET application to provide advanced search capabilities, such as full-text search, faceted search and geospatial search, which can be useful in e-commerce, content management systems, and logging and monitoring applications. It is known for its scalability, performance and its ability to handle large volumes of data with complex queries.
|
||||
|
||||
For more information, visit the following resources:
|
||||
|
||||
- [Guide to Solr in ASP.NET](https://www.codeproject.com/Tips/480091/Using-Solr-for-Search-with-NET-Csharp)
|
||||
- [How to get Started with Solr.NET?](https://stackoverflow.com/questions/5646615/how-to-get-started-with-solr-net)
|
||||
- [Integrate Solr Instance With .NET Core](https://stacksecrets.com/dot-net-core/integrate-solr-instance-with-net-core)
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user