🧩 Несколько DbContext в одном приложении на EF Core — когда это нужно
Использовать несколько DbContext в одном приложении — не ошибка, а часто отличное архитектурное решение.
Вот когда это оправдано:
- 🗃 Работа с несколькими базами данных
- 🧠 Разделение областей ответственности
- 🧩 Архитектура modular monolith
- ⚡ Использование read replicas
Автор применил это при создании модульного монолита:
каждый модуль имел собственную схему в БД и отдельный DbContext в коде.
Самое интересное — как EF Core справляется с миграциями и разными схемами баз данных.
Разбор и пошаговое решение — здесь:
🔗 https://milanjovanovic.tech/blog/using-multiple-ef-core-dbcontext-in-single-application
#DotNet #EFCore #CSharp #Backend #Architecture #DesignPatterns
Использовать несколько DbContext в одном приложении — не ошибка, а часто отличное архитектурное решение.
Вот когда это оправдано:
- 🗃 Работа с несколькими базами данных
- 🧠 Разделение областей ответственности
- 🧩 Архитектура modular monolith
- ⚡ Использование read replicas
Автор применил это при создании модульного монолита:
каждый модуль имел собственную схему в БД и отдельный DbContext в коде.
Самое интересное — как EF Core справляется с миграциями и разными схемами баз данных.
Разбор и пошаговое решение — здесь:
🔗 https://milanjovanovic.tech/blog/using-multiple-ef-core-dbcontext-in-single-application
#DotNet #EFCore #CSharp #Backend #Architecture #DesignPatterns
ASP .NET 10 получил новую возможность — Server-Sent Events (SSE)
В свежем ASP .NET 10 появилась поддержка Server-Sent Events — современного способа стримить данные в браузер без WebSockets.
Что такое SSE
- Односторонний канал: сервер → браузер
- Идеально подходит для потоковых обновлений, логов, нотификаций, live-данных
- Работает поверх обычного HTTP, без сложной настройки протокола
Почему это круто
- Проще, чем WebSockets
- Легче масштабировать
- Отлично подходит для real-time интерфейсов и hypermedia-приложений
- Встроено прямо в ASP .NET 10, без сторонних библиотек
Это может стать большим шагом для разработки динамичных и интерактивных UI — особенно там, где нужен непрерывный поток данных, но WebSockets избыточны.
#dotnet #aspnet #csharp #backend #webdev
В свежем ASP .NET 10 появилась поддержка Server-Sent Events — современного способа стримить данные в браузер без WebSockets.
Что такое SSE
- Односторонний канал: сервер → браузер
- Идеально подходит для потоковых обновлений, логов, нотификаций, live-данных
- Работает поверх обычного HTTP, без сложной настройки протокола
Почему это круто
- Проще, чем WebSockets
- Легче масштабировать
- Отлично подходит для real-time интерфейсов и hypermedia-приложений
- Встроено прямо в ASP .NET 10, без сторонних библиотек
Это может стать большим шагом для разработки динамичных и интерактивных UI — особенно там, где нужен непрерывный поток данных, но WebSockets избыточны.
#dotnet #aspnet #csharp #backend #webdev
⚡️ C#-приём: не привязывай метаданные к объектам через обычный `Dictionary` — иногда нужен `ConditionalWeakTable`.
Допустим, библиотека кеширует данные о типах:
В обычном приложении это может годами работать без проблем.
Но если используются plugins, dynamic assemblies или unloadable
И получить memory leak.
Для таких случаев в .NET есть малоизвестный:
Пример:
Ключ здесь хранится слабо.
Если
Это особенно полезно для:
* reflection-кешей;
* proxy/framework-кода;
* source/runtime metadata;
* plugin-систем;
* приложений с
🔥 Если видишь:
или
в коде, который работает с динамически загружаемыми сборками, стоит проверить:
не удерживает ли этот кеш сборки в памяти навсегда?
Иногда правильный ответ —
#CSharp #DotNet #Backend #Programming #CLR
Допустим, библиотека кеширует данные о типах:
private static readonly Dictionary<Type, Metadata> Cache = new();
В обычном приложении это может годами работать без проблем.
Но если используются plugins, dynamic assemblies или unloadable
AssemblyLoadContext, такой словарь способен удерживать Type, а вместе с ним — всю загруженную сборку.И получить memory leak.
Для таких случаев в .NET есть малоизвестный:
ConditionalWeakTable<TKey, TValue>
Пример:
private static readonly ConditionalWeakTable<Type, Metadata> Cache = new();
static Metadata GetMetadata(Type type)
{
return Cache.GetValue(type, BuildMetadata);
}
Ключ здесь хранится слабо.
Если
Type больше нигде не нужен, GC может его собрать, а связанная запись автоматически исчезнет из таблицы.Это особенно полезно для:
* reflection-кешей;
* proxy/framework-кода;
* source/runtime metadata;
* plugin-систем;
* приложений с
AssemblyLoadContext.🔥 Если видишь:
static Dictionary<Type, ...>
или
static ConcurrentDictionary<Type, ...>
в коде, который работает с динамически загружаемыми сборками, стоит проверить:
не удерживает ли этот кеш сборки в памяти навсегда?
Иногда правильный ответ —
ConditionalWeakTable.#CSharp #DotNet #Backend #Programming #CLR