Использование контейнеров, таких как Docker, в .NET приложениях имеет множество преимуществ, но также и некоторые недостатки. Вот основные из них:
Преимущества использования Docker для .NET приложений включают портативность, изолированность, легкость масштабирования, быстрое развертывание, консистентность среды и упрощенную CI/CD. Недостатки включают сложность изучения, потенциальные накладные расходы на производительность, вопросы безопасности, ограничения хост-системы и сложности управления состоянием и данными.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1
Anonymous Quiz
77%
Интерфейсы не могут содержать реализацию методов, абстрактные классы могут.
17%
Абстрактные классы могут содержать только абстрактные методы.
2%
Интерфейсы могут содержать поля.
5%
Абстрактные классы не могут быть наследованы.
🤔5👾1
Атрибуты в C# — это специальные метаданные, которые могут быть добавлены к кодовым элементам (классам, методам, свойствам, полям и т.д.) для предоставления дополнительной информации о них. Эти метаданные могут быть использованы во время выполнения программы с помощью рефлексии для изменения поведения или конфигурации приложения.
Атрибуты объявляются путем создания классов, производных от
System.Attribute. [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class MyCustomAttribute : Attribute
{
public string Description { get; }
public MyCustomAttribute(string description)
{
Description = description;
}
}
Атрибуты применяются путем указания их над соответствующими кодовыми элементами.
[MyCustomAttribute("This is a sample class")]
public class SampleClass
{
[MyCustomAttribute("This is a sample method")]
public void SampleMethod()
{
// Метод
}
}Рефлексия используется для получения информации об атрибутах во время выполнения.
using System;
using System.Reflection;
class Program
{
static void Main()
{
Type type = typeof(SampleClass);
// Получение атрибутов класса
object[] classAttributes = type.GetCustomAttributes(false);
foreach (var attr in classAttributes)
{
MyCustomAttribute myAttr = attr as MyCustomAttribute;
if (myAttr != null)
{
Console.WriteLine($"Class Attribute: {myAttr.Description}");
}
}
// Получение атрибутов метода
MethodInfo method = type.GetMethod("SampleMethod");
object[] methodAttributes = method.GetCustomAttributes(false);
foreach (var attr in methodAttributes)
{
MyCustomAttribute myAttr = attr as MyCustomAttribute;
if (myAttr != null)
{
Console.WriteLine($"Method Attribute: {myAttr.Description}");
}
}
}
}
C# и .NET Framework включают множество встроенных атрибутов для различных целей:
[Obsolete]: Указывает, что элемент устарел. [Obsolete("This method is obsolete. Use NewMethod instead.")]
public void OldMethod() { }
[Serializable]: Указывает, что класс может быть сериализован. [Serializable]
public class MySerializableClass { }
[TestMethod]: Используется в тестовых фреймворках, таких как MSTest, для обозначения метода тестирования. [TestMethod]
public void TestMethod1() { }
[HttpGet], [HttpPost]: Указывают, какие HTTP методы поддерживает контроллер в ASP.NET. [HttpGet]
public IActionResult Get() { }
Атрибуты в C# — это метаданные, добавляемые к кодовым элементам для предоставления дополнительной информации, конфигурации, валидации и интеграции с внешними инструментами. Они объявляются как классы, производные от
System.Attribute, и используются с помощью рефлексии для изменения поведения программы во время выполнения.Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
Anonymous Quiz
88%
Единица развертывания и версияции кода.
6%
Компонент для отладки кода.
3%
Объект для работы с потоками.
3%
Метод для сериализации данных.
Рефлексия (Reflection) в C# — это механизм, который позволяет программам исследовать и изменять свою структуру и поведение во время выполнения. С помощью рефлексии можно получать информацию о сборках, модулях, типах, методах, свойствах и других элементах кода, а также динамически вызывать методы и создавать экземпляры типов.
using System;
using System.Reflection;
public class ExampleClass
{
public int ExampleProperty { get; set; }
public void ExampleMethod()
{
Console.WriteLine("Hello from ExampleMethod!");
}
}
class Program
{
static void Main()
{
Type type = typeof(ExampleClass);
// Получение информации о свойствах
PropertyInfo[] properties = type.GetProperties();
foreach (var property in properties)
{
Console.WriteLine($"Property: {property.Name}, Type: {property.PropertyType}");
}
// Получение информации о методах
MethodInfo[] methods = type.GetMethods();
foreach (var method in methods)
{
Console.WriteLine($"Method: {method.Name}");
}
}
}
using System;
public class ExampleClass
{
public void ExampleMethod()
{
Console.WriteLine("Hello from ExampleMethod!");
}
}
class Program
{
static void Main()
{
Type type = typeof(ExampleClass);
object instance = Activator.CreateInstance(type);
MethodInfo method = type.GetMethod("ExampleMethod");
method.Invoke(instance, null); // Вывод: "Hello from ExampleMethod!"
}
}
using System;
using System.Reflection;
public class ExampleClass
{
public void Greet(string name)
{
Console.WriteLine($"Hello, {name}!");
}
}
class Program
{
static void Main()
{
Type type = typeof(ExampleClass);
object instance = Activator.CreateInstance(type);
MethodInfo method = type.GetMethod("Greet");
method.Invoke(instance, new object[] { "World" }); // Вывод: "Hello, World!"
}
}
Рефлексия в C# — это механизм для динамического исследования и изменения структуры и поведения программы во время выполнения. Она используется для получения информации о типах, создания объектов, вызова методов и других целей, таких как создание плагинов, сериализация, тестирование и отладка.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🤯1
Anonymous Quiz
70%
Возвращает первый не-null операнд.
13%
Возвращает последний не-null операнд.
16%
Используется для проверки типов.
1%
Используется для создания массивов.
Избежание deadlock'ов (взаимных блокировок) в многопоточном программировании — важная задача, требующая внимательного проектирования и разработки. Deadlock происходит, когда два или более потока не могут продолжать выполнение, потому что каждый из них ожидает освобождения ресурса, удерживаемого другим потоком. Вот несколько стратегий и методов для предотвращения deadlock'ов:
object lock1 = new object();
object lock2 = new object();
public void Method1()
{
lock (lock1)
{
lock (lock2)
{
// Действия с lock1 и lock2
}
}
}
public void Method2()
{
lock (lock1)
{
lock (lock2)
{
// Действия с lock1 и lock2
}
}
}
Monitor.TryEnter или Mutex.WaitOne, чтобы предотвратить бесконечное ожидание ресурсов.object lockObject = new object();
public void MethodWithTimeout()
{
bool lockTaken = false;
try
{
Monitor.TryEnter(lockObject, TimeSpan.FromSeconds(1), ref lockTaken);
if (lockTaken)
{
// Работа с lockObject
}
else
{
// Обработка ситуации, когда блокировка не была взята
}
}
finally
{
if (lockTaken)
{
Monitor.Exit(lockObject);
}
}
}
lock, Monitor, Mutex), используйте примитивы, которые уменьшают вероятность deadlock'ов, такие как SemaphoreSlim или ReaderWriterLockSlim.SemaphoreSlim semaphore = new SemaphoreSlim(1, 1);
public async Task MethodWithSemaphore()
{
await semaphore.WaitAsync();
try
{
// Действия, требующие синхронизации
}
finally
{
semaphore.Release();
}
}
object lockObject = new object();
public void Method()
{
// Выполняйте сложные операции вне блока lock
var data = GetData();
lock (lockObject)
{
// Выполняйте только необходимые действия внутри блока lock
ProcessData(data);
}
}
public object GetData()
{
// Долговременная операция
}
public void ProcessData(object data)
{
// Короткая операция
}
async и await, может помочь уменьшить блокировки потоков.public async Task MethodAsync()
{
await Task.Run(() =>
{
// Выполнение асинхронной работы
});
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤2
Anonymous Quiz
84%
Метод для очистки ресурсов, объявляется с помощью символа ~
12%
Метод для сериализации, объявляется с помощью ключевого слова final
2%
Метод для логирования, объявляется с помощью символа #
2%
Метод для отладки, объявляется с помощью ключевого слова debug
Паттерн DDD (Domain-Driven Design, предметно-ориентированное проектирование) — это методология разработки программного обеспечения, которая фокусируется на сложных предметных областях и переводе их в код. Основная идея DDD заключается в том, чтобы создать программные модели, которые соответствуют бизнес-логике и терминологии, используемой экспертами в данной предметной области.
Сущности и объекты-значения
// Value Object
public class Money
{
public decimal Amount { get; }
public string Currency { get; }
public Money(decimal amount, string currency)
{
Amount = amount;
Currency = currency;
}
public override bool Equals(object obj)
{
if (obj is Money money)
{
return Amount == money.Amount && Currency == money.Currency;
}
return false;
}
public override int GetHashCode() => (Amount, Currency).GetHashCode();
}
// Entity
public class Product
{
public Guid Id { get; }
public string Name { get; private set; }
public Money Price { get; private set; }
public Product(Guid id, string name, Money price)
{
Id = id;
Name = name;
Price = price;
}
public void Rename(string newName)
{
Name = newName;
}
public void ChangePrice(Money newPrice)
{
Price = newPrice;
}
}
Преимущества
Недостатки
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥2
Anonymous Quiz
84%
Array имеет фиксированный размер, ArrayList динамически изменяет размер.
7%
Array поддерживает любые типы данных, ArrayList только объекты.
4%
Array не поддерживает индексацию, ArrayList поддерживает.
6%
Array поддерживает обобщения, ArrayList не поддерживает.
Паттерн Event Sourcing (событийное моделирование) — это подход к управлению состоянием приложения, при котором все изменения состояния представляются в виде последовательности событий. Вместо хранения текущего состояния объекта в базе данных, сохраняются все изменения состояния (события), которые произошли с этим объектом. Текущее состояние может быть восстановлено путем последовательного применения этих событий.
public class AccountCreated
{
public Guid AccountId { get; }
public string Owner { get; }
public AccountCreated(Guid accountId, string owner)
{
AccountId = accountId;
Owner = owner;
}
}
public class MoneyDeposited
{
public Guid AccountId { get; }
public decimal Amount { get; }
public MoneyDeposited(Guid accountId, decimal amount)
{
AccountId = accountId;
Amount = amount;
}
}
public class MoneyWithdrawn
{
public Guid AccountId { get; }
public decimal Amount { get; }
public MoneyWithdrawn(Guid accountId, decimal amount)
{
AccountId = accountId;
Amount = amount;
}
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Anonymous Quiz
72%
Поле, значение которого можно установить только при инициализации или в конструкторе.
15%
Поле, значение которого нельзя изменить после присвоения.
10%
Метод, который можно вызвать только для чтения данных.
2%
Свойство, которое можно только установить, но не прочитать.
Основные концепции
Преимущества
Недостатки
Команда (Command)
public class CreateUserCommand
{
public string Name { get; }
public CreateUserCommand(string name)
{
Name = name;
}
}
Обработчик команды (Command Handler)
public class CreateUserCommandHandler
{
private readonly UserDbContext _context;
public CreateUserCommandHandler(UserDbContext context)
{
_context = context;
}
public void Handle(CreateUserCommand command)
{
var user = new User { Name = command.Name };
_context.Users.Add(user);
_context.SaveChanges();
}
}
Запрос (Query)
public class GetUserQuery
{
public int UserId { get; }
public GetUserQuery(int userId)
{
UserId = userId;
}
}
Обработчик запроса (Query Handler)
public class GetUserQueryHandler
{
private readonly UserDbContext _context;
public GetUserQueryHandler(UserDbContext context)
{
_context = context;
}
public User Handle(GetUserQuery query)
{
return _context.Users.Find(query.UserId);
}
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤1
Anonymous Quiz
27%
private
62%
protected
10%
internal
1%
public
🔥8😁2
Микросервис — это архитектурный стиль, который предполагает создание приложения в виде набора небольших, автономных сервисов, каждый из которых отвечает за выполнение конкретной бизнес-функции. Эти сервисы могут разрабатываться, развёртываться и масштабироваться независимо друг от друга.
Преимущества микросервисов
Недостатки микросервисов
Каждый из этих микросервисов имеет своё собственное API и базу данных.
// Пример простого контроллера для микросервиса пользователя
[ApiController]
[Route("api/[controller]")]
public class UserController : ControllerBase
{
private readonly IUserService _userService;
public UserController(IUserService userService)
{
_userService = userService;
}
[HttpGet("{id}")]
public ActionResult<User> GetUser(int id)
{
var user = _userService.GetUserById(id);
if (user == null)
{
return NotFound();
}
return Ok(user);
}
[HttpPost]
public ActionResult<User> CreateUser([FromBody] User user)
{
var createdUser = _userService.CreateUser(user);
return CreatedAtAction(nameof(GetUser), new { id = createdUser.Id }, createdUser);
}
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20
Anonymous Quiz
92%
Позволяют писать код, работающий с любыми типами данных.
5%
Позволяют сериализовать данные.
2%
Используются для работы с базами данных.
1%
Обеспечивают логирование приложений.
Легко масштабировать только те части системы, которые требуют этого, без необходимости масштабировать всё приложение. Например, если у вас есть микросервис, обрабатывающий заказы, и он испытывает высокую нагрузку, вы можете масштабировать только его, не трогая другие части системы.
Микросервисы можно развёртывать, обновлять и откатывать независимо друг от друга. Например вы можете обновить микросервис аутентификации без остановки микросервиса каталога продуктов.
Отказ одного микросервиса не приводит к отказу всего приложения. Например, если микросервис обработки платежей выходит из строя, пользователи всё равно могут просматривать продукты и добавлять их в корзину.
Каждый микросервис может быть написан на своем языке программирования и использовать свои технологии, что позволяет выбирать наиболее подходящие инструменты для каждой задачи. Например, Вы можете использовать Python для микросервиса машинного обучения и .NET для микросервиса управления пользователями.
Малые команды могут работать над разными микросервисами параллельно, что ускоряет процесс разработки. Например, одна команда может работать над микросервисом управления пользователями, в то время как другая команда работает над микросервисом заказа.
Управление множеством микросервисов требует сложной инфраструктуры для оркестрации, мониторинга и логирования. Например, вам нужно внедрить систему оркестрации, такую как Kubernetes, чтобы управлять развертыванием и масштабированием микросервисов.
Необходимо наладить надежные межсервисные коммуникации, что может быть сложно и привести к повышенным накладным расходам. Например, вам нужно решить, использовать ли синхронные (HTTP/REST) или асинхронные (сообщения, очереди) методы связи между микросервисами.
Тестирование микросервисной архитектуры сложнее из-за необходимости интеграции и взаимодействия между множеством независимых компонентов. Например вам нужно создать среду для интеграционного тестирования, которая включает все необходимые микросервисы.
Согласованность данных и управление транзакциями становятся более сложными задачами в распределённой системе. Например, вам нужно внедрить сложные механизмы для обеспечения согласованности данных, такие как саги или распределённые транзакции.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Anonymous Quiz
71%
var dict = new Dictionary<int, string>();
16%
Dictionary<int, string> dict = new Dictionary();
3%
var dict = new Dictionary<int>();
11%
Dictionary dict = new Dictionary<int, string>();
🤯16🤔1👾1
Паттерн "Разделяй и властвуй" (Divide and Conquer) разделяет задачи на более мелкие подзадачи для упрощения кода и повышения эффективности.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🤯2
Anonymous Quiz
50%
var name = obj?.ToString();
10%
var name = obj?.Name();
32%
var name = obj?.Name;
7%
var name = obj?.GetName;
🤔9👍2👀1