Стаття заснована на відповіді на StackOverflow. Почну з опису проблеми, з якою я зіткнувся. Є кілька сутностей в базі даних, які потрібно відображати у вигляді таблиць на UI. Для доступу до бази даних використовується Entity Framework. Для цих таблиць є фільтри, по полях цих сутностей. Потрібно написати код для фільтрації сутностей за параметрами.
Читати далі →

Ми вже кілька років робимо наш продукт автоматизації маркетингу, і пиляти фічі з високою швидкістю нам допомагає CI, а точніше — велика кількість автоматичних тестів.

У продукті приблизно 700 000 рядків коду з усіма кастомизациями, і на це ми маємо близько 7 000 тестів, і їх кількість постійно зростає. За рахунок них ми не боїмося робити великі рефакторинги, що зачіпають багато частин системи. Але, на жаль, тести не панацея. Якихось тестів може не бути, якісь тести можуть виявитися занадто дорогими, а якісь ситуації не відтворюються в тестовій середовищі.

Практично кожна транзакція в нашій системі пов'язана з роботою з MS SQL з використанням LinqToSql. Так, технологія старенька, але мігрувати з неї нам досить складно, і по бізнесу вона нас цілком влаштовує. Більш того, як я вже писав раніше, у нас навіть є свій форк LinqToSql, де ми трохи чиним його баги і додаємо деякий функціональності.

Для того, щоб робити запити до БД, використовуючи LinqToSql, потрібно використовувати інтерфейс IQueryable. В момент отримання Enumerator'а чи виконання Execute у QueryProvider'а побудоване дерево виразів з допомогою Extension-методів до IQueryable транслюється в SQL, який і виконується на SQL Server.

Так як наша бізнес-логіка сильно зав'язана на сутності в базі даних, наші тести багато працюють з базою даних. Однак у 95% тестів ми не використовуємо реальну базу, так як це дуже дорого за часом, а задовольняємося InMemoryDatabase. Вона є частиною нашої тестової інфраструктури, про яку можна написати окрему статтю, і насправді представляє з себе просто Dictionary<Type, List> для кожного існуючого типу сутності. У тестах наш UnitOfWork прозоро працює з такою базою, даючи доступ до EnumerableQueryable, який просто отримати з будь-якого IEnumerable, викликавши у нього AsQueryable().

Покажу приклад тесту для розуміння того, що відбувається:

Читати далі →

Для оцінки якості роботи нашого аналізатора, а також з метою популяризації методології статичного аналізу, ми регулярно перевіряємо на наявність помилок проекти з відкритим вихідним кодом і пишемо про це статті. Не став винятком і минулий 2016 рік, який примітний ще й тим, що це був час своєрідного «дорослішання» C# аналізатора. PVS-Studio отримав значну кількість нових C# діагностик, покращений механізм роботи з віртуальними значеннями (symbolic execution) і багато іншого. За результатами проведеної нашою командою роботи, я склав своєрідний хіт-парад найбільш цікавих помилок, виявлених у проектах З# в 2016 році.

Читати далі →

нещодавно Вирішив написати невелике ASP.Net MVC додаток після багаторічної перерви і знаючі люди на Хабре підказали спробувати новий ASP.Net Core, тим більше, що він працює в Лінуксі з коробки без необхідності задіяти mono, і, судячи з останніми тестами, навіть показує непогану продуктивність. За основу взяв аналогічну статтю для Mac, але тут на відміну від надихнула мене статті хочу описати процес покроково в одному місці, для того, щоб не довелося лазити по перехресним посиланням, намагаючись розібратися як встановити незрозуміло для чого призначені програми та пакети. Таке докладний опис процесу можливо допоможе багатьом уникнути граблів, з якими довелося зіткнутися мені. Кілька фраз і малюнків, в частині однаковою для будь-якої платформи, з правками і доповненнями взяті з статті для Mac.


Читати далі →

Вітаю всіх. У сьогоднішній статті мова піде про те, як можна реалізувати власний високорівневий API в керованому коді для роботи з пристроями друку, від встановлення нового монітора друку в системі і до отримання обробленого драйвером пристрою друку документа з порту принтера.

Як і в минулий раз, стаття буде корисна для ознайомлення розробникам молодшого та середнього ланки. В процесі вивчення матеріалу, Ви дізнаєтеся як можна звертатися до низькорівневим DLL WinAPI в C# з допомогою P/Invoke, як встановити, налаштувати і видалити з системи монітори друку, драйвер принтера, сам пристрій друку, відкрити і зв'язати порт для перенаправлення вхідних даних з пристрою друку на монітор, познайомитеся з ключовими моментами застосування маршалирования. Так само ми на практичному прикладі розберемося, як за допомогою нашого API можна зручно маніпулювати пристроями друку в системі, дізнаємося, як можна перехопити оброблені дані після друку принтера і, наприклад, відправити їх на сервер.

Читати далі →

Повторна перевірка SharpDevelop: що нового?

Інструмент PVS-Studio постійно вдосконалюється. При цьому найбільш динамічно в даний час розвивається аналізатор C# код: у 2016 році в нього було додано дев'яносто нових діагностичних правил. Ну а найкращим показником якості роботи аналізатора є виявлені ним помилки. Завжди цікаво, а також досить корисно, проводити повторні перевірки великих відкритих проектів, порівнюючи результати. Сьогодні я зупинюся на повторній перевірці проекту SharpDevelop.

Читати далі →

Маппінг в C# на прикладі сериализатора для AMF

Вітаю, друзі. Сьогодні мова піде про реалізацію мапінгу на C#, а так само про застосування цього реалізації у вирішенні реальних завдань на прикладі відправки даних AMF на сервер. Все нижчевикладене не претендує на якісь еталони реалізації алгоритмів і патернів проектування коду, це лише опис одного з багатьох, далеко не завжди очевидних для новачків, рішень.

У процесі вивчення статті, Ви дізнаєтеся, як реалізувати власні атрибути і як їх застосовувати, познайомитеся з методами типів розширень і застосуванням рефлексії на практиці, дізнаєтеся про основи HTML в цілому і OpCodes зокрема, а так само про те, як можна сериализации об'єкти в AMF з допомогою потоків.

Читати далі →

ASP.NET Core: Створення серверних служб для мобільних додатків

Представляємо другу частину серії статей, присвячених розробці на ASP.NET Core. У цьому навчальному матеріалі ви дізнаєтеся, як створювати серверні служби за допомогою ASP.NET Core MVC для підтримки мобільних додатків.

Читати далі →

Про порівняння об'єктів за значенням — 6: Structure Equality Implementation

попередній публікації ми розглянули особливості пристрою і роботи структур платформи .NET є "типами за значенням" (Value Types) в розрізі порівняння за значенням об'єктів — примірників структур.
Тепер розглянемо готовий приклад реалізації порівняння за значенням об'єктів — примірників структур.
Допоможе приклад для структур більш точно визначити з предметної (доменної) точки зору область застосовності порівняння об'єктів за значенням в цілому, і тим самим спростити зразок порівняння за значенням об'єктів — примірників класів є ссылочными типами (Reference Types) виведений в одній з попередніх публікацій?
Читати далі →

Про порівняння об'єктів за значенням — 5: Structure Equality Problematic

попередній публікації ми вивели найбільш повний і коректний спосіб реалізації порівняння за значенням об'єктів — примірників класівссылочными типами — Reference Types для платформи .NET.

Яким чином потрібно модифікувати запропонований спосіб для коректної реалізації порівняння за значенням об'єктів — примірників структур"типами за значенням" — Value Types)?

Примірники структур, в силу своєї природи, завжди порівнюються за значенням.
Для визначених типів, таких як Boolean або Int32, під порівнянням за значенням розуміється порівняння безпосередньо значень примірників структур.
Якщо структура визначена розробником — користувачем платформи, то порівняння за замовчуванням автоматично реалізується як порівняння значень полів примірників структур.
(Подробиці див. в описі методу ValueType.Equals(Object) та операторів == і !=
Також при цьому автоматично певним чином реалізується метод ValueType.GetHashCode(), перекриває метод Object.GetHashCode().

І в цьому випадку є кілька суттєвих підводних каменів:


Читати далі →