C# | Вопросы собесов
5.1K subscribers
35 photos
1 file
982 links
Download Telegram
🤔 Как используется ключевое слово await?

В C#, ключевое слово `await` используется в сочетании с асинхронными методами для указания точки, в которой выполнение текущего метода будет приостановлено до завершения асинхронной операции. `await` делает код асинхронной операции выглядящим как синхронный и позволяет возвращать управление вызывающему коду, предотвращая блокировку UI или других операций, пока асинхронная операция выполняется.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥2
🤔 Для чего используются expression`ы?

Для представления кода в виде структур данных, что позволяет программно создавать, анализировать и выполнять этот код. Это дает мощные возможности для динамической работы с кодом, включая создание, трансформацию и выполнение выражений во время выполнения программы.

🚩Основные сценарии

🟠LINQ to SQL и другие ORM
Expression`ы широко используются в ORM (Object-Relational Mapping) системах, таких как Entity Framework и LINQ to SQL, для преобразования выражений LINQ в SQL-запросы.
using (var context = new MyDbContext())
{
var query = context.Users.Where(u => u.Age > 30);
// Выражение `u => u.Age > 30` представлено как Expression и переводится в SQL
foreach (var user in query)
{
Console.WriteLine(user.Name);
}
}


🟠Динамическое построение запросов
Expression`ы позволяют создавать динамические запросы, которые могут изменяться в зависимости от условий во время выполнения программы.
public static IQueryable<T> ApplyFilter<T>(IQueryable<T> query, string propertyName, object value)
{
var parameter = Expression.Parameter(typeof(T), "x");
var member = Expression.Property(parameter, propertyName);
var constant = Expression.Constant(value);
var body = Expression.Equal(member, constant);
var predicate = Expression.Lambda<Func<T, bool>>(body, parameter);

return query.Where(predicate);
}


🟠Построение компилируемых делегатов
Expression`ы можно использовать для создания делегатов, которые компилируются во время выполнения, что позволяет динамически генерировать и выполнять код.
Expression<Func<int, int, int>> expr = (a, b) => a + b;
var func = expr.Compile();
int result = func(2, 3); // result = 5


🟠Анализ и трансформация кода
Expression`ы позволяют анализировать и изменять выражения, что полезно для создания библиотек и фреймворков, которые работают с выражениями.
Expression<Func<int, bool>> expr = x => x > 5;
var body = (BinaryExpression)expr.Body;
var left = (ParameterExpression)body.Left;
var right = (ConstantExpression)body.Right;
Console.WriteLine($"Left: {left.Name}, Right: {right.Value}"); // Output: Left: x, Right: 5


🟠Валидация и динамическая генерация правил
Expression`ы могут быть использованы для создания динамических правил валидации и их проверки.
public static Func<T, bool> GetValidator<T>(string propertyName, object value)
{
var parameter = Expression.Parameter(typeof(T), "x");
var member = Expression.Property(parameter, propertyName);
var constant = Expression.Constant(value);
var body = Expression.Equal(member, constant);
return Expression.Lambda<Func<T, bool>>(body, parameter).Compile();
}

var validateAge = GetValidator<User>("Age", 30);
bool isValid = validateAge(new User { Age = 30 }); // isValid = true


🟠Кэширование и оптимизация
Expression`ы могут быть использованы для создания кэша выражений, что позволяет оптимизировать выполнение часто повторяющихся операций.
var parameter = Expression.Parameter(typeof(int), "x");
var body = Expression.Multiply(parameter, Expression.Constant(2));
var lambda = Expression.Lambda<Func<int, int>>(body, parameter);
var compiled = lambda.Compile();

// Кэшируем делегат
var cache = new Dictionary<int, Func<int, int>>();
cache[2] = compiled;

int result = cache ; // result = 6


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍2
🤔 Что такое сервис локатор?

Сервис локатор — это шаблон проектирования, который используется в программировании для управления зависимостями между классами. Он действует как централизованный реестр, который хранит экземпляры сервисов и предоставляет их по запросу. В C# этот шаблон помогает избежать жесткой связи между компонентами программы, облегчая тестирование и поддержку.
1. Централизованное управление: Сервис локатор держит реестр всех доступных сервисов и предоставляет их по запросу, что упрощает управление жизненным циклом объектов.
2. Гибкость: Шаблон позволяет легко заменять и обновлять сервисы без изменения кода, который их использует, что делает приложение более модульным.
3. Изоляция зависимостей: С помощью сервис локатора, компоненты могут запрашивать зависимости в рантайме, что снижает зависимость от конкретных реализаций.
Однако стоит учитывать, что чрезмерное использование сервис локатора может привести к скрытому управлению зависимостями, что усложняет отслеживание и управление ими в больших приложениях. Это может сделать архитектуру приложения менее прозрачной и затруднить отладку и тестирование.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👍31
Forwarded from Идущий к IT
Твое резюме на HeadHunter — ОК, если ты видишь это.

HeadHunter сравнивает ключевые навыки в твоем резюме и в вакансии и в момент отклика отображает, насколько % ты соответствуешь требованиям.

Специальный бейджик «Подходит по навыкам на 100%» отображается, если соответствие составляет более 60%.

Если при просмотре вакансий ты видишь такой бейджик, это значит, что список навыков в твоем резюме качественно составлен.

Это важный параметр, так как рекрутерам чаще показываются резюме с лучшим соответствием.

О том, как правильно указывать ключевые навыки и оптимизировать свое резюме я уже рассказывал в этом видео
😁2👍1
🤔 Что такое expression?

Это структура данных, представляющая код в виде дерева. Деревья выражений позволяют программно строить, анализировать и выполнять код. Это мощный инструмент для динамического создания и трансформации выражений, что делает их полезными в различных сценариях, таких как LINQ, ORM (например, Entity Framework), динамическое построение запросов и создание компилируемых делегатов.

🚩Основные концепции

🟠Expression Tree (дерево выражений)
Это структура данных, которая представляет синтаксическое дерево кода. Каждая нода (узел) дерева является экземпляром класса Expression или его производных.
🟠System.Linq.Expressions
Пространство имен, в котором находятся классы и методы для работы с деревьями выражений.

🚩Пример создания

Простое арифметическое выражение
using System;
using System.Linq.Expressions;

class Program
{
static void Main()
{
// Создаем параметры для выражения
ParameterExpression paramA = Expression.Parameter(typeof(int), "a");
ParameterExpression paramB = Expression.Parameter(typeof(int), "b");

// Создаем выражение: a + b
BinaryExpression body = Expression.Add(paramA, paramB);

// Компилируем выражение в делегат
var add = Expression.Lambda<Func<int, int, int>>(body, paramA, paramB).Compile();

// Используем делегат
int result = add(2, 3);
Console.WriteLine(result); // Output: 5
}
}


🚩Сценарии использования expression

🟠LINQ to SQL и другие ORM
Деревья выражений широко используются в ORM системах для преобразования выражений LINQ в SQL-запросы. Это позволяет использовать LINQ-запросы для взаимодействия с базами данных.
using (var context = new MyDbContext())
{
var query = context.Users.Where(u => u.Age > 30);
// Выражение `u => u.Age > 30` представлено как Expression и переводится в SQL
foreach (var user in query)
{
Console.WriteLine(user.Name);
}
}


🟠Динамическое построение запросов
Деревья выражений позволяют создавать динамические запросы, которые могут изменяться в зависимости от условий во время выполнения программы.
public static IQueryable<T> ApplyFilter<T>(IQueryable<T> query, string propertyName, object value)
{
var parameter = Expression.Parameter(typeof(T), "x");
var member = Expression.Property(parameter, propertyName);
var constant = Expression.Constant(value);
var body = Expression.Equal(member, constant);
var predicate = Expression.Lambda<Func<T, bool>>(body, parameter);

return query.Where(predicate);
}


🟠Построение компилируемых делегатов
Деревья выражений можно использовать для создания делегатов, которые компилируются во время выполнения, что позволяет динамически генерировать и выполнять код.
Expression<Func<int, int, int>> expr = (a, b) => a + b;
var func = expr.Compile();
int result = func(2, 3); // result = 5


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🤔 Что такое asp.net

ASP.NET — это веб-платформа от Microsoft для создания динамических сайтов и веб-приложений. Она работает на базе .NET Framework, предоставляя разработчикам доступ к широкому набору инструментов и библиотек. ASP.NET поддерживает множество языков программирования, включая C# и VB.NET, что делает её универсальной для различных задач.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
🤔 Где используется IQueryable?

IQueryable используется для работы с данными в LINQ (Language Integrated Query) и позволяет создавать запросы, которые могут быть выполнены в различных источниках данных, таких как базы данных, XML-документы, коллекции объектов и другие. IQueryable поддерживает отложенное выполнение (deferred execution) запросов и предоставляет возможности для построения сложных запросов, которые могут быть оптимизированы и преобразованы в соответствующий язык запросов, например, SQL для работы с базами данных.

🚩Основные сценарии

🟠LINQ to SQL и Entity Framework
Одним из наиболее распространенных примеров использования IQueryable является работа с базами данных через ORM, такие как LINQ to SQL и Entity Framework. IQueryable позволяет создавать запросы, которые преобразуются в SQL-запросы и выполняются в базе данных.
using (var context = new MyDbContext())
{
IQueryable<User> usersQuery = context.Users.Where(u => u.Age > 30);

foreach (var user in usersQuery)
{
Console.WriteLine(user.Name);
}
}


🟠Отложенное выполнение (Deferred Execution)
Запросы, построенные с использованием IQueryable, выполняются только при их итерации (например, с помощью foreach) или при вызове методов, таких как ToList(), First(), Single(), Count() и т.д. Это позволяет строить запросы динамически, добавляя условия в зависимости от логики приложения.
IQueryable<User> usersQuery = context.Users;

if (includeInactive)
{
usersQuery = usersQuery.Where(u => !u.IsActive);
}

List<User> users = usersQuery.ToList();


🟠Поддержка сложных запросов
IQueryable позволяет создавать сложные запросы, включающие фильтрацию, сортировку, группировку и объединение данных.
var query = from user in context.Users
where user.Age > 30
orderby user.Name
select new { user.Name, user.Age };

foreach (var user in query)
{
Console.WriteLine($"{user.Name}, {user.Age}");
}


🟠Провайдеры LINQ
IQueryable часто используется провайдерами LINQ, которые могут преобразовывать выражения LINQ в специфичные для источника данных команды. Например, провайдер Entity Framework преобразует выражения LINQ в SQL-запросы.
public class MyCustomProvider : IQueryProvider
{
public IQueryable CreateQuery(Expression expression)
{
return new MyCustomQueryable(expression);
}

public IQueryable<TElement> CreateQuery<TElement>(Expression expression)
{
return new MyCustomQueryable<TElement>(expression);
}

public object Execute(Expression expression)
{
// Логика выполнения запроса
}

public TResult Execute<TResult>(Expression expression)
{
// Логика выполнения запроса
}
}


🚩Примеры использования

Фильтрация и сортировка
using (var context = new MyDbContext())
{
IQueryable<User> query = context.Users
.Where(u => u.Age > 30)
.OrderBy(u => u.Name);

foreach (var user in query)
{
Console.WriteLine($"{user.Name}, {user.Age}");
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🤔 Что такое EF?

EF (Entity Framework) — это ORM (Object-Relational Mapping) для .NET, облегчающая работу с базами данных. С помощью EF разработчики могут манипулировать данными как объектами C# без необходимости писать SQL-код. Он автоматически преобразует объекты в SQL-запросы и обратно.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
🤔 Как работают join`ы?

join в LINQ используется для объединения двух последовательностей на основе соответствия ключей. Вот краткие примеры, показывающие, как работают join в LINQ.

🚩Основные типы

🟠Inner Join
Соединяет элементы двух коллекций, если их ключи совпадают.
var query = from user in users
join order in orders on user.Id equals order.UserId
select new { user.Name, order.OrderId };


🟠Group Join
Создает группы элементов из второй коллекции, соответствующие каждому элементу из первой коллекции.
var query = from user in users
join order in orders on user.Id equals order.UserId into userOrders
select new { user.Name, Orders = userOrders };


🟠Left Join (нет прямой поддержки, можно имитировать с помощью DefaultIfEmpty)
Возвращает все элементы из первой коллекции и соответствующие элементы из второй коллекции, если они существуют.
var query = from user in users
join order in orders on user.Id equals order.UserId into userOrders
from order in userOrders.DefaultIfEmpty()
select new { user.Name, OrderId = order?.OrderId };


🚩Примеры

Данных
var users = new List<User>
{
new User { Id = 1, Name = "Alice" },
new User { Id = 2, Name = "Bob" }
};

var orders = new List<Order>
{
new Order { OrderId = 101, UserId = 1 },
new Order { OrderId = 102, UserId = 1 },
new Order { OrderId = 103, UserId = 2 }
};


Inner Join
var query = from user in users
join order in orders on user.Id equals order.UserId
select new { user.Name, order.OrderId };

foreach (var item in query)
{
Console.WriteLine($"{item.Name} - {item.OrderId}");
}


Group Join
var query = from user in users
join order in orders on user.Id equals order.UserId into userOrders
select new { user.Name, Orders = userOrders };

foreach (var item in query)
{
Console.WriteLine($"{item.Name} has {item.Orders.Count()} orders");
}


Left Join
var query = from user in users
join order in orders on user.Id equals order.UserId into userOrders
from order in userOrders.DefaultIfEmpty()
select new { user.Name, OrderId = order?.OrderId };

foreach (var item in query)
{
Console.WriteLine($"{item.Name} - {item.OrderId}");
}


Ставь
👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥52👍2
🤔 В чем разница между асинхронностью и многопоточностью?

Асинхронность позволяет выполнять задачи без блокировки основного потока, в то время как многопоточность предполагает разделение кода на несколько потоков. Асинхронные операции выполняются в том же потоке, но не блокируют его, а многопоточность использует параллельные потоки для выполнения задач одновременно.\

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥21
🤔 Как оптимизировать ситуацию, когда к таблице много join`ов?

🟠Индексы
Создайте индексы на столбцах, используемых в условиях соединения (join).
CREATE INDEX idx_user_id ON Users(Id);
CREATE INDEX idx_order_user_id ON Orders(UserId);


🟠Избегайте ненужных полей
Выбирайте только необходимые столбцы, чтобы уменьшить объем данных.
var query = from user in users
join order in orders on user.Id equals order.UserId
select new { user.Name, order.OrderId };


🟠Используйте отложенную загрузку (Lazy Loading)
Отложенная загрузка загружает данные только тогда, когда они действительно нужны.
var user = context.Users.Find(userId);
context.Entry(user).Collection(u => u.Orders).Load();


🟠Разделение на подзапросы
Разделите сложные запросы на подзапросы для улучшения читаемости и производительности.
var userIds = users.Select(u => u.Id).ToList();
var query = from order in orders
where userIds.Contains(order.UserId)
select order;


🟠Применяйте фильтрацию до join
Фильтруйте данные перед выполнением join, чтобы уменьшить размер соединяемых таблиц.
var filteredUsers = users.Where(u => u.IsActive);
var query = from user in filteredUsers
join order in orders on user.Id equals order.UserId
select new { user.Name, order.OrderId };


🟠Используйте оптимизированные ORM функции
Используйте функции ORM, которые могут генерировать более оптимизированные SQL-запросы.
var query = context.Users
.Where(u => u.IsActive)
.SelectMany(u => u.Orders, (user, order) => new { user.Name, order.OrderId });


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2😁2
🤔 Как используется ключевое слово await?

Ключевое слово await используется для приостановки выполнения метода до завершения асинхронной задачи. Оно позволяет освобождать текущий поток и возвращается к коду после завершения задачи. await применяется в асинхронных методах, объявленных с помощью async.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥1
🤔 Расскажи про метод ASP/Query?

Не является стандартным термином в ASP.NET или ASP.NET Core. Возможно, имеется в виду подход к созданию запросов или API-методов в ASP.NET Core для обработки HTTP-запросов. Рассмотрим, как создавать и обрабатывать запросы в ASP.NET Core.

🚩Создание и Обработка Запросов

🟠Создание контроллера
Контроллеры в ASP.NET Core отвечают за обработку HTTP-запросов и возврат ответов. Контроллеры обычно наследуются от класса ControllerBase или Controller.
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/[controller]")]
public class UsersController : ControllerBase
{
private readonly IUserService _userService;

public UsersController(IUserService userService)
{
_userService = userService;
}

[HttpGet("{id}")]
public IActionResult GetUser(int id)
{
var user = _userService.GetUserById(id);
if (user == null)
{
return NotFound();
}
return Ok(user);
}

[HttpPost]
public IActionResult CreateUser([FromBody] User user)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
_userService.CreateUser(user);
return CreatedAtAction(nameof(GetUser), new { id = user.Id }, user);
}
}


🟠Создание сервиса
Сервисы содержат бизнес-логику приложения. Обычно они регистрируются в контейнере зависимостей.
public interface IUserService
{
User GetUserById(int id);
void CreateUser(User user);
}

public class UserService : IUserService
{
private readonly List<User> _users = new List<User>();

public User GetUserById(int id)
{
return _users.FirstOrDefault(u => u.Id == id);
}

public void CreateUser(User user)
{
user.Id = _users.Count + 1;
_users.Add(user);
}
}


🟠Модель данных
Модель данных представляет структуру данных, с которой работает приложение.
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}


🟠Регистрация сервисов в контейнере зависимостей
Регистрация сервисов в Startup.cs.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddScoped<IUserService, UserService>();
}


🟠Настройка маршрутизации
Настройка маршрутизации для контроллеров в Startup.cs.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}

app.UseRouting();

app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}


🚩Пример вызова API

GET-запрос для получения пользователя
GET /api/users/1


POST-запрос для создания пользователя
POST /api/users
Content-Type: application/json

{
"name": "Alice",
"age": 30
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🤔 Что такое lock-еры?

Lock-еры — это объекты или механизмы, такие как lock в C#, которые предотвращают одновременный доступ к критическим участкам кода из нескольких потоков. Они обеспечивают безопасное выполнение кода в многопоточной среде, исключая гонки данных. Например, lock блокирует выполнение других потоков, пока текущий поток не завершит работу с ресурсом.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6👀1
🤔 Что бывает, когда количества подключений не хватает?

🟠Отказы в подключении
Новые запросы к базе данных не могут быть обработаны, так как нет доступных подключений. Это приводит к тому, что запросы отклоняются или истекает время ожидания (timeout).

🟠Задержки и снижение производительности
Запросы могут быть помещены в очередь и ждать доступного подключения, что увеличивает время отклика и снижает производительность системы.

🟠Ошибки и исключения
Приложение может выбрасывать исключения, такие как TimeoutException, SqlException (например, Cannot open connection), указывающие на невозможность установления соединения.

🚩Примеры исключений

try
{
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
// Выполнение операций с базой данных
}
}
catch (SqlException ex)
{
Console.WriteLine("Ошибка подключения к базе данных: " + ex.Message);
}
catch (TimeoutException ex)
{
Console.WriteLine("Превышено время ожидания подключения: " + ex.Message);
}


🚩Причины исчерпания подключений

🟠Плохое управление подключениями
Неосвобождение ресурсов: Пул подключений может исчерпаться, если подключения не закрываются и не возвращаются в пул после использования. Длительное удержание подключений: Подключения удерживаются слишком долго, например, при выполнении долгих операций в одной сессии.
🟠Высокая нагрузка
Чрезмерное количество одновременно выполняемых запросов, превышающее максимальное количество доступных подключений в пуле.
🟠Неправильная настройка пула подключений
Недостаточное количество максимальных подключений в пуле или слишком большое время ожидания подключения.

🚩Способы решения проблемы

🟠Правильное управление подключениями
Всегда закрывайте соединения после использования, чтобы они возвращались в пул.
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
// Выполнение операций с базой данных
connection.Close(); // Явно закрываем подключение
}


Используйте конструкцию using для автоматического закрытия соединений.
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
// Выполнение операций с базой данных
} // Подключение автоматически закрывается здесь


🟠Настройка пула подключений
Увеличьте максимальное количество подключений в пуле.
var connectionString = "Data Source=server;Initial Catalog=database;User ID=user;Password=password;Max Pool Size=100;";


Настройте время ожидания подключения.
var connectionString = "Data Source=server;Initial Catalog=database;User ID=user;Password=password;Connection Timeout=30;";


🟠Оптимизация запросов и транзакций
Минимизируйте время удержания соединений. Используйте транзакции эффективно, чтобы не блокировать соединения на долгое время.
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
using (var transaction = connection.BeginTransaction())
{
try
{
// Выполнение операций с базой данных
transaction.Commit();
}
catch
{
transaction.Rollback();
throw;
}
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Как работает сборка мусора на платформе .NET?

Сборка мусора (.NET Garbage Collector) автоматически управляет памятью, удаляя объекты, к которым нет ссылок. GC работает в нескольких поколениях, чтобы оптимизировать производительность, очищая короткоживущие объекты чаще. Он запускается, когда система нуждается в памяти или при достижении определённых условий.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥2
🤔 Как можно не используя middleware выполнить действие перед обработкой запроса и после?

В ASP.NET Core можно выполнять действия до и после обработки запроса, не используя middleware, с помощью фильтров действий (Action Filters). Фильтры позволяют выполнять код до и после вызова метода контроллера.

🚩Фильтры действий (Action Filters)

🟠Создание фильтра действия
Создадим фильтр, который выполняет код до и после метода действия контроллера.
using Microsoft.AspNetCore.Mvc.Filters;
using System;

public class MyActionFilter : Attribute, IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
// Код, выполняемый до действия контроллера
Console.WriteLine("До выполнения действия контроллера.");
}

public void OnActionExecuted(ActionExecutedContext context)
{
// Код, выполняемый после действия контроллера
Console.WriteLine("После выполнения действия контроллера.");
}
}


🟠Применение фильтра к контроллеру или действию
Фильтр можно применить к конкретному методу контроллера или ко всему контроллеру.
using Microsoft.AspNetCore.Mvc;

public class MyController : Controller
{
[MyActionFilter]
public IActionResult MyAction()
{
// Логика действия контроллера
return Ok("Action executed");
}
}


Применение ко всему контроллеру
using Microsoft.AspNetCore.Mvc;

[MyActionFilter]
public class MyController : Controller
{
public IActionResult MyAction1()
{
// Логика действия контроллера
return Ok("Action 1 executed");
}

public IActionResult MyAction2()
{
// Логика действия контроллера
return Ok("Action 2 executed");
}
}


🟠Применение глобального фильтра
Фильтр также можно зарегистрировать глобально, чтобы он применялся ко всем контроллерам и действиям. Регистрация глобального фильтра в Startup.cs
using Microsoft.AspNetCore.Mvc;

public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(options =>
{
options.Filters.Add<MyActionFilter>();
});
}


🚩Пример выполнения действий до и после запроса

Создание фильтра
using Microsoft.AspNetCore.Mvc.Filters;
using System;

public class LoggingActionFilter : Attribute, IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
// Логика до выполнения действия контроллера
Console.WriteLine("Запрос начался: " + context.HttpContext.Request.Path);
}

public void OnActionExecuted(ActionExecutedContext context)
{
// Логика после выполнения действия контроллера
Console.WriteLine("Запрос завершился: " + context.HttpContext.Request.Path);
}
}


Применение фильтра к контроллеру
using Microsoft.AspNetCore.Mvc;

[LoggingActionFilter]
public class UsersController : Controller
{
public IActionResult GetUser(int id)
{
// Логика действия контроллера
return Ok(new { Id = id, Name = "User" + id });
}
}


Регистрация в Startup.cs
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}

app.UseRouting();

app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 Что такое сервис локатор?

Сервис-локатор — это паттерн проектирования, который предоставляет центральный реестр для поиска и получения экземпляров зависимостей или сервисов.
Класс сервис-локатора хранит ссылки на сервисы и позволяет запрашивать их по идентификатору, что упрощает управление зависимостями.
Однако этот паттерн критикуют за скрытые зависимости и нарушение принципа инверсии зависимостей (SOLID).


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1
🤔 Какие есть базовые сущности RabbitMQ?

Это популярный брокер сообщений, который используется для обмена сообщениями между различными компонентами системы. В RabbitMQ есть несколько базовых сущностей, которые нужно понимать для эффективного использования этой технологии.

🚩Базовые сущности

🟠Сообщения (Messages)
Это данные, которые отправляются от отправителя к получателю через RabbitMQ. Сообщения могут содержать любые данные: текст, JSON, XML, двоичные данные и т.д.

🟠Очереди (Queues)
Э
то места, где сообщения хранятся до тех пор, пока их не заберет получатель. Очереди обеспечивают надежную доставку сообщений и поддерживают множество получателей.
Создание очереди
rabbitmqadmin declare queue name=my_queue durable=true


🟠Обменники (Exchanges)
Принимают сообщения от отправителей и направляют их в соответствующие очереди на основе правил маршрутизации. Существует несколько типов обменников:
Direct: Сообщения направляются в очередь с ключом маршрутизации, точно соответствующим ключу, указанному в обменнике.
Fanout: Сообщения направляются во все очереди, связанные с этим обменником, без учета ключа маршрутизации.
Topic: Сообщения направляются в очереди на основе шаблонов ключей маршрутизации.
Headers: Сообщения направляются в очереди на основе соответствия заголовков.
Создание обменника:
rabbitmqadmin declare exchange name=my_exchange type=direct durable=true


🟠Связи (Bindings)
Определяют правила маршрутизации между обменниками и очередями. Они указывают, какие ключи маршрутизации должны использоваться для доставки сообщений из обменника в очередь.
Создание связи
rabbitmqadmin declare binding source=my_exchange destination=my_queue routing_key=my_key


🟠Ключи маршрутизации (Routing Keys)
Ключи маршрутизации используются обменниками для определения, в какие очереди направлять сообщения. Они играют ключевую роль при использовании direct и topic обменников.

🟠Потребители (Consumers)
Это приложения или службы, которые получают сообщения из очередей и обрабатывают их. Пример производителя на Python
import pika

def callback(ch, method, properties, body):
print(f"Received {body}")

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

channel.queue_declare(queue='my_queue')

channel.basic_consume(queue='my_queue', on_message_callback=callback, auto_ack=True)

print('Waiting for messages. To exit press CTRL+C')
channel.start_consuming()


🟠Производители (Producers)
Э
то приложения или службы, которые отправляют сообщения в обменники RabbitMQ. Пример производителя на Python
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

channel.queue_declare(queue='my_queue')

channel.basic_publish(exchange='', routing_key='my_queue', body='Hello World!')

print(" [x] Sent 'Hello World!'")
connection.close()


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31
🤔 Что такое get?

get — это метод или функция, используемая для получения значения из объекта, коллекции или свойства.
В языке Python, например, метод get применяется к словарям для безопасного извлечения значения по ключу, возвращая None или значение по умолчанию, если ключ отсутствует.
В JavaScript get может быть геттером, определяющим, как получить значение свойства объекта при его доступе.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4👾1