{"id":23782672,"url":"https://github.com/ihalavin/mpp-labs","last_synced_at":"2026-06-13T21:33:10.197Z","repository":{"id":268767018,"uuid":"435999378","full_name":"ihalavin/mpp-labs","owner":"ihalavin","description":"C# projects","archived":false,"fork":false,"pushed_at":"2021-12-29T14:54:43.000Z","size":68,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-11-10T21:23:20.562Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ihalavin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-12-07T19:16:22.000Z","updated_at":"2021-12-29T14:54:45.000Z","dependencies_parsed_at":"2024-12-18T19:54:41.350Z","dependency_job_id":"d9d74198-f920-48c6-b6a2-dc88af1d1822","html_url":"https://github.com/ihalavin/mpp-labs","commit_stats":null,"previous_names":["ihalavin/mpp-labs"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ihalavin/mpp-labs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ihalavin%2Fmpp-labs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ihalavin%2Fmpp-labs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ihalavin%2Fmpp-labs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ihalavin%2Fmpp-labs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ihalavin","download_url":"https://codeload.github.com/ihalavin/mpp-labs/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ihalavin%2Fmpp-labs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34301731,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-13T02:00:06.617Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-01-01T12:18:42.984Z","updated_at":"2026-06-13T21:33:10.178Z","avatar_url":"https://github.com/ihalavin.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# MPP-labs\nModern Programming Platforms labs\n\n#### Lab 1 - Tracer\nНеобходимо реализовать измеритель времени выполнения методов.\n\nTracer должен собирать следующую информацию об измеряемом методе:\n- имя метода;\n- имя класса с измеряемым методом;\n- время выполнения метода.\n\nТакже должно подсчитываться общее время выполнения анализируемых методов в одном потоке (для этого достаточно подсчитать сумму времен \"корневых\" методов, вызванных из потока).\n\nРезультаты трассировки вложенных методов должны быть представлены в соответствующем месте в дереве результатов.\n\nРезультат измерений должен быть представлен в двух форматах: JSON и XML (для классов, реализующих сериализацию в данные форматы, необходимо разработать общий интерфейс).\n\nГотовый результат (полученный JSON и XML) должен выводиться в консоль и записываться в файл. Для данных классов необходимо разработать общий интерфейс, допустимо создать один переиспользуемый класс, не зависящий от того, куда должен выводиться результат.\n\n#### Lab 2 - Faker\nНеобходимо реализовать генератор объектов со случайными тестовыми данными.\n\nПри создании объекта следует использовать конструктор, а также заполнять публичные поля и свойства с публичными сеттерами, которые не были заполнены в конструкторе. Следует учитывать сценарии, когда у класса только приватный конструктор, несколько конструкторов, конструктор с параметрами и публичные поля/свойства. \n\nПри наличии нескольких конструкторов следует отдавать предпочтение конструктору с большим числом параметров, однако если при попытке его использования возникло исключение, следует пытаться использовать остальные. \n\nЗаполнение должно быть рекурсивным (если полем является другой объект, то он также должен быть создан с помощью Faker).\n\nРеализовать генераторы случайных значений для базовых типов-значений (int, long, double, float, etc), строк, одного любого системного класса для представления определенного типа данных на выбор (дата/время, url, etc), коллекций объектов всех типов, которые могут быть сгенерированы Faker (поддержка разновидностей IEnumerable\u003cT\u003e, List\u003cT\u003e, IList\u003cT\u003e, ICollection\u003cT\u003e, T[] на усмотрение автора, минимум один вариант из приведенных).\n\nСоздание коллекций должно выполняться аналогично созданию других типов, для которых есть генераторы. Внутри кода Faker не должно быть проверок if/switch на коллекцию и какой-то особой обработки. Допустим и любой другой способ, согласующийся с требованием об отсутствии специальных проверок для коллекций.\n\nВыделить как минимум 2 предопределенных генератора в отдельные подключаемые модули (плагины), которые будут загружаться на старте приложения.\n\nПредусмотреть учет циклических зависимостей.\n\n#### Lab 3 - Assembly Browser\nНеобходимо реализовать графическую утилиту с использованием WPF для просмотра информации о составе произвольной .NET сборки. \n\nСодержимое загруженной сборки должно быть представлено в иерархическом виде (элемент управления TreeView):\n- пространства имен; \n  - типы данных; \n    - поля, свойства и методы (информация о методах помимо имени должна включать сигнатуру, о полях и свойствах - тип).\n\nОбязательным является применение MVVM, а также использование INotifyPropertyChanged и ICommand.\n\n#### Lab 4 - Tests Generator\nНеобходимо реализовать многопоточный генератор шаблонного кода тестовых классов для одной из библиотек для тестирования (NUnit, xUnit, MSTest) по тестируемым классам.\n\nВходные данные: \n- список файлов, для классов из которых необходимо сгенерировать тестовые классы;\n- путь к папке для записи созданных файлов;\n- ограничения на секции конвейера  (см. далее).\n\nВыходные данные:\n- файлы с тестовыми классами (по одному тестовому классу на файл, вне зависимости от того, как были расположены тестируемые классы в исходных файлах);\n- все сгенерированные тестовые классы должны компилироваться при включении в отдельный проект, в котором имеется ссылка на проект с тестируемыми классами;\n- все сгенерированные тесты должны завершаться с ошибкой.\n\nГенерация должна выполняться в конвейерном режиме \"производитель-потребитель\" и состоять из трех этапов: \n- параллельная загрузка исходных текстов в память (с ограничением количества файлов, загружаемых за раз);\n- генерация тестовых классов в многопоточном режиме (с ограничением максимального количества одновременно обрабатываемых задач); \n- параллельная запись результатов на диск (с ограничением количества одновременно записываемых файлов).\n\nПри реализации использовать async/await и асинхронный API. Для реализации конвейера можно использовать Dataflow API.\n\nНеобходимо сгенерировать по одному пустому тесту на каждый публичный метод тестируемого класса.\n\nДля синтаксического разбора и генерации исходного кода следует использовать Roslyn.\n\n#### Lab 5 - Dependency Injection Container\nНеобходимо реализовать простой Dependency Injection контейнер.\n\nКонтейнер должен позволять регистрировать зависимости в формате: Тип интерфейса (TDependency) -\u003e Тип реализации (TImplementation), где TDependency — любой ссылочный тип данных, а TImplementation — не абстрактный класс, совместимый с TDependency, объект которого может быть создан.\n\nВнедрение зависимостей должно осуществляться через конструктор. Создание зависимостей должно выполняться рекурсивно, то есть если TImplementation имеет свои зависимости, а каждая из его зависимостей — свои (и т. д.), то контейнер должен создать их все.\nКонтейнер должен быть отделен от своей конфигурации: сначала выполняется создание конфигурации и регистрация в нее зависимостей, а затем создание на ее основе контейнера.\n\nНеобходимо реализовать два варианта времени жизни зависимостей (задается при регистрации зависимости): \n- instance per dependency — каждый новый запрос зависимости из контейнера приводит к созданию нового объекта;\n- singleton — на все запросы зависимостей возвращается один экземпляр объекта (следует учитывать параллельные запросы в многопоточной среде).\n\nНеобходимо учитывать ситуацию наличия нескольких реализаций для одной зависимости и предусмотреть способ получения сразу всех реализаций.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fihalavin%2Fmpp-labs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fihalavin%2Fmpp-labs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fihalavin%2Fmpp-labs/lists"}