• Как правильно настроить Dependency Injection в ASP.NET MVC?

    Нужно разомкнуть зависимости.

    Когда Dependency Injection либа пытается ресолвнуть "самую глубокую" зависимость, в вашем случае это IAccountsService, то она не может этого сделать, т.к. встречает цикл.

    Вам нужно изменить связи между классами, например добавить новый сервис, который получает IAccountsService и IPersonaDataProvider, при этом сами IAccountsService и IPersonaDataProvider не должны зависить друг от друга, т.е. стать независимыми относительно друг друга.

    Это если хотите использовать инжект в конструктор, как в примерах выше.
    Как другое решение, не очень думаю для вашей ситуации, это использовать инжект в свойство. Он отработает даже с циклической зависимостью.

    По этой теме есть хорошая книга - Симан Марк "Внедрение зависимостей в .NET".
    Ответ написан
    2 комментария
  • Вопрос о многопоточности ASP.NET - как работают заблокированные потоки?

    ASP.NET MVC and Web API - Comparison of Async / Sy...

    Есть пул потоков.
    Пришел запрос - достали поток из пула, и он начал обрабатывать запрос.

    Если поток встретил await (запрос в БД например, не CPU bound операция) и результат не доступен (может быть доступен сразу), то он ушел обратно в пул. Когда await получит результат, то из пула достанут поток и передадут ему результат и он продолжит выполнение.

    Если поток встретит запрос в БД, но не будет await, то он останется ждать результата, в пул не вернется, не сможет обслуживать другие запросы, просто будет ждать.

    Пример из жизни:
    Заказали пиццу по телефону.
    - синхронно - идем к двери и ждем звонка от курьера.
    - асинхронно - занимается другими делами, когда курьер доставит пиццу он позвонит в дверь и мы подойдем за ней.

    Асинхронность != многопоточность, это ее часть.
    What is the difference between asynchronous progra...
    Ответ написан
    2 комментария
  • Где находится статический класс в памяти?

    Вспомнил, что читал про такое в книге "Оптимизация приложений на платформе .Net".


    Таблица методов
    Поле указателя на таблицу методов ссылается на внутреннюю структуру CLR под названием таблица методов (method table), которая в свою очередь ссылается на другую внутреннюю структуру под названием EEClass (где ЕЕ, это аббревиатура от Execution Engine - механизм выполнения). Вместе, таблица методов и EEClass, содержат информацию, необходимую для выбора виртуального метода, метода интерфейса, статической переменной, определения типа объекта во время выполнения, доступа к методам базового класса и многих других целей. Таблица методов содержит часто используемую информацию, требуемую для выполнения операций такими механизмами, как механизм выбора виртуального метода, а структура EEClass содержит информацию, используемую реже, например, механизмом рефлексии. Ознакомиться с содержимым обеих структур данных можно с помощью команд !DumpMT и !DumpClass библиотеки SOS.

    Массив ссылок на статические поля фиксируется так, что его адрес не может быть изменен сборщиком мусора, кроме того, статические поля простых типов размещаются внутри таблицы методов, которая не затрагивается сборщиком мусора. Это гарантирует, что для доступа к таким полям можно без опаски использовать жест­ко зашитые адреса.


    Есть таблицы, где вся информация хранится.
    В windbg можно посмотреть подробней.

    Пример класса:
    class MyClass
    {
        private string _field1 = "Some string 1";
        public string Field2 { get; set; }
    }
    
    0:003> !do 0000005400006600
    Name:        ConsoleApplication1.MyClass
    MethodTable: 00007ffa2b5c4378
    EEClass:     00007ffa2b6d2548
    Size:        32(0x20) bytes
    File:        E:\...\ConsoleApplication1.exe
    Fields:
                  MT    Field   Offset                 Type VT     Attr            Value Name
    00007ffa89d60e08  4000002        8        System.String  0 instance 0000005400006620 _field1
    00007ffa89d60e08  4000003       10        System.String  0 instance 00000054000035a0 <Field2>k__BackingField


    Если интересно ставьте SOS и играйтесь.
    Я это уже делал, и выкладывал результаты в https://habr.com/ru/post/260047/
    Заминусили, многого не знал тогда. Но это уже история.
    Ответ написан
    2 комментария
  • Правильно ли я пишу на asp.net Core?

    1) Репозиторий - коллекция, и методы работы с ней как с коллекцией, ничего лишнего.
    2) Controller - посредник между View и Model (стиль MVC). В нем не должно быть никакой бизнес логики, а значит и открытия коннекта и выполнения запроса с его текстом. Тут должен быть вызов компетентного исполнителя - сервиса.

    Рекоменую посмотреть на - CleanArchitecture https://github.com/jasontaylordev/CleanArchitecture

    Посмотрите на готовые сайты:
    https://github.com/nopSolutions/nopCommerce
    https://github.com/simplcommerce/SimplCommerce
    И крутого монстра - https://github.com/dotnet-architecture/eShopOnCont...

    Все сразу не запомнится и не зайдет, это долгий путь.

    Самый лучший курс от 0 до норм понимания - https://codewithmosh.com/p/become-a-full-stack-net...
    Состоит из трех частей, где автор создает готовое приложение вроде мини соц сети с музыкой, вроде.
    Можно в целом его посмотреть, и делать как он, не промахнешся.
    Ответ написан
    Комментировать
  • Как подключить Visual Studio к Unity?

    Вы точно что то забыли.

    Вот статья о том как настроить совместную работы Unity 3D и Visual Studio - https://docs.microsoft.com/ru-ru/visualstudio/cros...

    Справа вверху есть переключаться на Русский язык.
    Ответ написан
    2 комментария
  • Какой может быть алгоритм для составления рейтинга?

    Книга - Грокаем алгоритмы (Адитья Бхаргава)
    В главе "Алгоритм k ближайших соседей" есть интересные идеи, на примере упрощенной системы рекомендаций фильмов в Netflix.

    Хотя вам помоему просто достаточно число лайков собрать и все, у кого больше тот и круче. Вы ведь не рекомендовать ее собираетесь конкретно Ивану или Пете, а всем подряд, не имея данных по их личным предпочтениям, тоесть анониму, там голые числа думаю пойдут, сравнивать то не счем.

    В дополнение можно погуглить, лучше на English "how to build a rating system algorithm":
    1) Building a ratings system
    2) algorithm used to calculate 5 star ratings
    Ответ написан
    Комментировать
  • Оптимизация запросов БД?

    SQL. Полное руководство
    В этой книге материала достаточно для общего понимания вашего вопроса, я вот очень доволен ей, очень много узнал. У вас возможно диплом связан с БД, будет очень полезно.

    Еще - Оптимизация запросов в SQL Server 2008 R2
    Ответ написан
    1 комментарий
  • Как проверять запущен ли процесс и если не запущен - запустить?

    1) Сделать его службой, с автозапуском.
    2) Сделать два процесса, которые смотрят друг на друга, и при необходимости "подымают" (такое использовалось при атаке на атомные электростанции, Марк Руссинович своими утилитами на докладе вычищал это дело). Чтобы не запускалось копий больше чем необходимо можно использовать объект синхронизации ядра (это пару строк на C#).

    Вот видео с привязкой ко времени с Марком - https://youtu.be/bNJ3HR6Z0v8?t=1964

    О, обратил внимание что вы увлекаетесь ИБ, я там около года крутился, столько всего насмотрелся, что в интернет боюсь заходить :)
    Рекомендую связаться с ребятами из Pentestit, там и чат есть.
    Ответ написан
    2 комментария
  • Как решить ошибку subquery must return only one column?

    Что мы имеем работая с SQL:
    SQL всегда возвращает таблцу в ответ.
    Таблица состоит из строк и столбцов.
    В одном столбце может быть только одно значение.

    Итого:
    1) Чтобы мы получили требуемое нам нужно склеить массив test в один столбец, можно использовать функцию CONCAT.
    2) Если мы не хотим конкатить, то выводим для каждой записи test дубликат других данных (group, currentAddress) через JOIN.
    Ответ написан
    Комментировать
  • Как сохранять состояние приложения, чтобы не было лага?

    Что значит в реальном времени, у вас ОС реального времени?

    1)Может вам не состояние сохранять а вести журнал всех изменений, и по требованию восстанавливать структуру воспроизводя действия из журнала в том же порядке. Как БД делают с транзакциями, журнал транзакций, сначала пишем в него, а потом уже пытаемся выполнить. Только не удалять потом из него, что то вроде Event Sourcing получается. Таким подходом у вас в любой момент можно восстановится до последнего состояния до сбоя/выключения. но лог огромным может быть, их помоему можно склеивать.

    Идея такая - посмотреть как работают Inmemory DB, SQL, NoSQL.

    2)Идеально было бы не заморачиваться так.
    Возможно сдлеать что то типо команд.
    В ПО летит команда - сделай что то с объектом.
    Вы эту команду кидаете менеджеру.
    Менеджер хранит две копии одинаковых объектов, и для каждого из них держит две одинаковые очереди команд. Когда объект готов, он берет команду из своей очереди, и выполняет ее.
    Вы нажимаете сохранить копию объекта на диск.
    Менеджер берет говорит одному из объектов - сохранись на диск, тот перестает выполнять поступающие команды, и сохраняется на диск. После этого продолжает выполнять команды, догоняя своего соседа. Догонит он его или нет не понятно, но вот что он будет его копией на момент времени Х, определенно.
    Памяти будет кушать много (два объекта, две очереди, одна из которых может "опаздывать/догонять"), но в теории должно работать.
    Это напоминает асинхронную реплику, только в памяти и там том же устройстве.

    2.1) В памяти может быть только один объект. Менеджер при поступлении служебной команды на сохранения объекта, может продолжать складировать обычные команды в очередь дальше, как объект сохраниться, он продолжит брать команды из нее.
    Приложение не будет зависать, но и мгновенное выполнение команд не гарантируется.

    3) Сделать клон в памяти быстрее чем на диске. Делаем клон в памяти, и сохраняем его на диск, после удаляем (мержить и догонять не нужно, проще удалить целиком и сделать новый когда потребуется).
    Ответ написан
    Комментировать
  • Есть ли деобфускатор исходных файлов C#?

    Проблем то нет, скомпилируйте, и прогоните через то что нашли.

    А так по этой теме есть лучший ресурс в сети интернет - exelab. Тема "Опять .net (part 2)". Там вы найдете все что вам понадобится и "дружелюбное" комьюнити :D
    Я там как то зависал давно, ребята лучшие в своем деле.
    Ответ написан
  • Как развернуть окно по нажатию горячих клавиш?

    На сколько я понял, нажатие клавишь направляется не в окно вашего приложения а в любое другое, например Explorer. Так как такие действия не направлены в ваш app, то словить вы их стандартным способом никак не сможете. Например у меня открыт калькулятор и браузер, то что я пиши в браузере не попадает в калькулятор, и наоборот.

    Чтобы отлавливаеть такие нажатия как вы хотите нужен глобальный хук, т.е. вы будите ловить все нажатия в Windows.
    Global keyboard capture in C# application
    Ответ написан
    Комментировать
  • Как подготовиться к олимпиаде по программированию?

    На хабре статьи были, примеры задание, их разбор. Описание того как они проводятся, как проверяются решения, как составляются задания и т.п.

    Вот запрос https://habr.com/ru/search/?target_type=posts&orde...
    Ответ написан
    Комментировать
  • Как организовать объединение элементов массива, которые сами являются массивами?

    Общая схема:
    Web Browser (Client) <-----А-----> Server <------Б----> DB (SQL)

    А (и данных не много):
    На клиент данные можно передавать плоским списком, т.е. массивом как у вас.
    Клиент строит дерево самостоятельно.

    Б:
    В БД записей может быть очень много, передавать их все серверу НЕ НУЖНО, он рано или поздно ляжет, и ляжет сеть по которой эти данные будут передваться.
    Фильтрацию данных почти в любом случае должен делать SQL сервер на своей стороне, он для этого оптимизирован.

    Записи в БД можно хранить как плоский список.
    -id
    -parentId
    -...

    И еще одна таблица для иерархии (с помощью этой таблицы мы избавляемся от рекурсии, но это добавляет сложности на поддержание этой таблицы в актуальном состоянии):
    -id_предок
    -id_потомок

    Запрос - например, дай мне всех потомков для записи с id = 2, делаем запрос в таблицу иерархии и достаем все Id_потомки у которых есть предок с Id=2. Так можно очень легко доставать записи любого уровно вложенности, и спокойно гулять вниз-вверх.

    Если запрос тяжелый, то можно использовать представление (View), представление можно сделать материализованным (т.е. будет создана таблица с ее результатами, и она сама будет поддерживаться в актуальном состоянии при обновлении исходных таблиц. Но это накладные расходы).

    Немного не по теме:
    Мы на одном проекте как то делали фолдеры с файлами доступными через Web. Я как раз занимался хранением дерева в БД, и отслеживанием всех операций (копирование, перемещение, удаление). На фронте той же темой на Angular. Там 3 кейса нужно отследить в итоге нужно всего - узел пермещается в root; узел из root перемещается в дочерний узел; узел перемещается из одного дочернего узла в другой.
    Ответ написан
    Комментировать
  • Подробно о хранимых процедурах?

    1) SQL Полное руководство Третье издание.
    Глава 20. Хранимые процедуры SQL.
    И по тексту иногда встречаются.

    В этой книге хорошо показано что стандарт SQL один (не в смысле версий), а реализаций несколько, и что код переносить не всегда просто. Есть примеры для разных СУБД.
    Ответ написан
    Комментировать
  • Как отлавливать исключения в методе другого класса?

    Все нормально.

    class A просто обрабатывает только исключение типа "SQLExeption", и видать знает что с этим делать, а с другими ничего поделать не может, поэтому и не ловит.

    Вам же нужно либо расширить обработку class A всех других исключений, или ловить их уже в других классах, которые используют class A.

    try-catch (Справочник по C#)
    Ответ написан
    Комментировать
  • Использование неявного типизирования для определения типа переменной цикла?

    Наоборот, если вы явно укажите тип сами проблем точно не будет.

    Просто var более короткая запись, и очень часто используется когда тип справа точно известен, или наоборот неизвестен (анонимный var a = new { A = 1, B = 2}).

    С var могут быть и проблемы, например, когда мы ожидали FLOAT, а получили DOUBLE (для этого можно как указывать тип, так и ипспользовать постфикс F или D). (var приведется к ближайшему вмещающему типу)

    Я когда начинал изучать C# тоже не сразу понял в чем прикол, а со временем сам перешел на var.

    Код получается короче, и меньше дублирующейся информации:
    Customer c = new Customer();
    var c = new Customer();

    When to Use and Not Use var in C#
    Ответ написан
    Комментировать
  • Как правильно написать файловый сервис на asp.net core web api?

    1) Можно использовать БД для всего. Там и файл, и ссылка на него.
    + все в одном месте.
    + легко бекапить.
    + транзация на всю операцию целиком.
    - база будет очень большой.

    2) Можно использовать БД только для хранения ссылок на файл.
    + БД маленькая.
    + хранилище отдельно.
    - бекап БД и хранилища файлов осуществляется раздельно.
    - нет транзакций, файл может быть записан, а ссылки не будет, и на оборот.

    БД - SQL или NoSQL.
    Т.к. связей нет, то лучше NoSQL.

    Безопасность - Авторизация, токены или куки. Ничего другого.
    Тут либо сервис во внутренней сети, и ничего не нужно. Или сервис доступен снаружи, и нужна авторизация.
    Можно погуглить как работает Azure Blob storage, идеи взять от туда.

    Проблема с размером решается, больше гуглить.
    Ответ написан
    Комментировать
  • Помощь в архитектуре ПО?

    Если правильно понял задачу, то:
    1) Создаем интерфейс ITestDevice, который будет единым для всех железок.
    2) Для каждой железки создается свой адаптер, который реализует ITestDevice. В нем учитываются особенности каждой железки, и подгоняются под единый интерфейс.
    3) Каждый девайс должен иметь свой уникальный Id (GUID/int32/string). Инициализируется этот Id в адаптере, или в классе устройства, который используется в адаптере.

    4) Создается интерфейс ITest. Он единый для всех тестов.
    5) Создаем тесты.

    6) Забиваем пары Id_testDevice - Id_test в храналище данных.
    7) Запускаем приложение, оно читает данные из хранилища, и передает каждому ITestDevice свои списки тестов, затем запускает их.

    ITestDevice - имеет список тестов (ITest) которые он запускает.
    ITest - может быть как атомарным тестом (1 шт), так и композитным (внутри себя содержит список других тестов, без фанатизма и рекурсий)).
    Если есть тесты только для конкретных девайсов, то тестам можно прописать типы, и проверять их (иерархией или полем type).

    А) Если тест не пройдет, то девайс завершает прогон. Это делает сам дейвайс, который смотрит на возвращаемое значение каждого теста, перебирая их в цикле. У теста может быть булево свойство Success.
    Б) Или можно сделать TestManager, который получает ITestDevice и его список ITest, и по одной штуке в цикле начинает скармливать тесты девайсу (например в метод ITestDevice.Run(ITest test)), проверяя результат, записывая в лог и решать продолжить тестирование или перейти к следующему дейвасу. Такой подход отделит правила прохода набора тестов от самого девайса, менеджер может получать их из хранилища.
    Ответ написан
  • Чем конструктор отличается от метода?

    Конструктор - специальный метод, который призван создавать экземпляры класса или структуры. У него нет возвращаемого значения (неявный void).
    Дефолтный конструктор - конструктор без аргументов.

    Метод тоже может создавать новый экземпляр, но его нельзя вызвать через оператор new .... ().

    Условно:
    Конструктор - метод для создания экземпляра.
    Метод - это поведение созданных экземпляров.

    var a = new Constructor();
    a.Method();

    https://docs.microsoft.com/ru-ru/dotnet/csharp/pro...
    Ответ написан
    Комментировать