У нас есть большое приложение на основе ERP, которое использует несколько технологий .net в нескольких различных проектах. Структура решения похожа на:
Библиотеки классов:
- Core (инфраструктура, расширения, утилиты и т. Д.)
- Бизнес (тесно связанный POCO с сопоставлениями в Gentle.Net) - унаследованный уровень, который будет преобразован в веб-службы.
- Домен (объекты poco, отраженные из базы данных, созданной для EF)
- Данные (EF dbcontext, сопоставление конфигурации с объектами домена)
- InstanceContext = db context для всех таблиц (~ 400 сопоставленных таблиц)
- ReadOnlyContext = db context для всех представлений базы данных (~ 500 сопоставленных представлений)
Веб-сервисы:
- Веб-сервисы (устаревшие сервисы asmx)
- API (веб-API)
Передние торцы:
- Приложение WebForms (90% интерфейса)
- Приложение WebForms зависло на .net 3.5 в устаревшем режиме cas, чтобы обеспечить приличную производительность экспорта локальных отчетов rdlc.
- Приложение MVC (более новая версия интерфейса)
- Различные приложения WinForms для интеллектуальных клиентов, настроенные для нужд клиентов
Мы постепенно реорганизуем приложение, чтобы, надеюсь, отделить некоторые подпрограммы бизнес-логики. Мы начали с замены Gentle.Net ORM (очень старой ORM, которая хорошо с нами обращалась на протяжении многих лет) на Entity Framework. Однако мы столкнулись с проблемой использования памяти (не утечки памяти).
Сначала это казалось очень безболезненным, поскольку мы запустили генератор обратного POCO EF для существующей базы данных и внедрили функцию DbConfiguration для создания файла EDMX (для более быстрого запуска).
Теперь, когда большинство проектов внешнего интерфейса и веб-сервисов используют EF, требования к памяти стремительно растут. Каждому домену приложения требуется ~ 500 МБ памяти для хранения контекстов БД, это происходит во время инициализации EF. Мы провели обширное профилирование памяти и можем подтвердить, что использование нашего контекста правильно утилизируется. Похоже, что DbCompiledModels остаются в памяти навсегда, так как EF требует, чтобы кэшированные данные работали.
I может объединить проекты MVC / Webforms, ASMX / WebAPI вместе, чтобы уменьшить объем требуемой памяти, поскольку это приведет к удалению 2 доменов приложений. Но мне интересно, есть ли способ, которым я мог бы поделиться кэшированными моделями сущностей \ отображением информации между различными доменами приложений. Как распределенный кеш, но для DbCompiledModels?
Каждый проект запускается как приложение на одном веб-сайте в IIS, и они всегда будут использовать один и тот же контекст базы данных \ mappings, поэтому их необязательно создавать экземплярами для каждого домена приложений.
* примечание - хотя существуют более эффективные способы рефакторинга этой проблемы, они требуют значительного времени для рефакторинга и тестирования из-за размера приложения. Исправление низко висящих фруктов даст нам немного передышки. Если при запуске каждое приложение может совместно использовать инфраструктуру сущностей информации отображения в памяти, это сократит использование памяти на 50%.