Ответы пользователя по тегу .NET
  • Почему не работает Property injection в ASP.NET Core MVC через Autofac?

    @basrach
    .RegisterType().As().PropertiesAutowired()

    Этим самым вы сказали, что хотите чтобы Autofac, при создании экземпляра класса Lol произвел инъекцию во всего его (объекта Lol) публичные свойства. Чтобы работал ваш пример, нужно сделать тоже самое но для типа UniversityController.
    А вообще лучше не использовать инъекцию через свойства. Никогда.
    Ответ написан
  • Жизненноважный вопрос. Забудется ли в армии программирование?

    @basrach
    Как говорится, опыт не пропьешь. Но вот только его и не пропьешь. Если вы пока только изучаете, но пока не практикуете, то можно смело идти армию, терять по сути нечего.
    Ответ написан
  • Каким образом делается взаимодействие с hardware в микросервисной архитектуре и Docker-контейнерах?

    @basrach
    COM, USB, принтеры и какие-то специфичные железяки для терминалов - та часть, где код должен быть по определению железо-зависимым. Контейнеры же про диаметрально противоположное, про абстракцию от железа и окружения. Т.е. писать софт для специфичной железяки и запускать его в контейнере, это как в истории про микроскоп и гвозди.
    Вы сделали правильный вывод. Нужно выносить в контейнеры только логику независящую от какого-либо железа или оборудования. А сервисы, взаимодействующие с железом, разворачивать там где и железо.
    Ответ написан
  • LINQ to SQL и Enum?

    @basrach
    'Edm.Int32'

    Очевидно что стандартный enum невозможно конвертировать в какой-то там 'Edm.Int32'. Об этом среда вам и говорит. Если вообще проблема в этой строке.
    Но так как объявления классов вы не привели, вполне может быть что и SomeProperty имеет у вас этот странный тип, в который linq не может автоматом замапить значение из БД.


    Вспомнил, edm = Entity Data Model.
    У вас какая-то древняя версия EF? Похоже на баг ранних версия EF. Попробуйте заменить
    Error = ErrorLine.None
    на
    Error = (ErrorLine)1 // то значение, которое имеет None
    Ответ написан
  • Как запустить Task на определённое время?

    @basrach
    string serverName = null;
    	var cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(30));
    	Task.Run(() => serverName = Server.GetServerName(), cancellationTokenSource.Token);


    В таком случае вызов Server.GetServerName() будет происходить в фоне и не заблокирует основной поток. Теоретически через 30 секунд задача будет отменена. Но по факту задача будет висеть в режиме ожидание ответа по сети до тех пор, пока ответ не придет, и только после того как придет ответ будет выбран свободный поток из пула, который возьмет эту задачу для продолжения выполнения и возможно прервет её, но возможно что и не прервет.

    Если вам гарантированно нужно чтобы задача не выполнилась после истечения 30 секунд, то нужно переделать метод GetServerName() следующим образом:
    public string GetServerName(CancellationToken cancellationToken)
    {
    	// здесь непосредственно вызов по сети
    	
    	cancellationToken.ThrowIfCancellationRequested();
    }

    либо:
    public string GetServerName(CancellationToken cancellationToken)
    {
    	// здесь непосредственно вызов по сети
    
    	if (cancellationToken.IsCancellationRequested)
    	{
    		return;
    	}
    }

    ну и соответственно его вызов будет выглядеть в таком случае вот так:
    Server.GetServerName(cancellationTokenSource.Token)
    Ответ написан
  • Как маппить пакеты по opcode?

    @basrach
    Профессионалами реализуется через switch-case - наиболее понятный для тех кто будет поддерживать и эффективный способ. В качестве же упражнения, либо если вы работаете не в команде, можно попробовать через кодогенерацию, reflection и что еще в голову придет.
    Ответ написан
  • Использование Nhibernate и Entity framework в одном проекте?

    @basrach
    Уживутся. Подводных камней нет, кроме того что сами можете временами путаться что у вас через EF, а что через Nhibernate.
    Ответ написан
  • Как передать данные между двумя приложениями?

    @basrach
    Обычно для этих целей используют так называемые "очереди сообщений". Данный паттерн, очередь сообщений, широко применим и универсален. Например очередь сообщений можно построить на основе таблицы БД. В составе почти любой ОС от Microsoft есть специальный компонент под названием MSMQ, что является реализацией распределенной очереди сообщений с гарантией доставки и т.д.
    Но чаще всего для ситуаций вроде вашей используют RabbitMq, хотя это уже не просто очередь, а брокер сообщений. Он популярен и у него относительно низкий порог входа. Существует множество библиотек под наверное любой язык. Так что начать работать с ним не составит большого труда. Легко разворачивается. Не требует сложной настройки, если нет особых требований. Настроить нужно только кроме роутинг сообщений. Но если использовать какую-нибудь либу, то и роутинг она может настроить автоматически. Для C# например вот хорошая библиотека. Советую посмотреть в эту сторону.
    Ответ написан
  • Как контролировать память кортежей?

    @basrach
    В приведенном примере проблемы нет, утечки быть не может. Если утечка 100% есть, то скорее всего, когда создавали этот пример на основе реального кода, вы упустили важную деталь из-за которой и происходит утечка.
    Ответ написан
  • В последних версиях .net что-то изменили в зависимостях сборок?

    @basrach
    Всегда так работало. Т.е. ссылка на Project3 не обязана быть в Project1.
    Скорее всего ваша проблема имела другую причину. Но лечилась добавлением ссылки на Project3. Возможно поэтому вы так подумали.
    Ответ написан
  • ASP.NET Core: сколько должно быть конфигов дли разных баз данных и как их распределить по контроллерам?

    @basrach
    Вам нужны два разных контекста. Контексты, это те классы, которые наследуются от DbContext, и абстрагируют доступ к БД. Один для одной базы, другой для второй базы. Соответственно и конфигов у вас будет по числу баз данных, т.е. тоже два.
    Ответ написан
  • Вопросы по Clean Architecture?

    @basrach
    Есть два варианта.

    Первый заключается в том, чтобы выгружать из БД всю коллекцию тегов. В данном случае такое решение будет вполне оправданным. Поскольку обычно задачи, и вообще что-либо, содержат 3-5 тегов, максимум 7-10, очень редко больше. В таком случае вполне нормально сделать свойство Tags у сущности Task и ожидать, что там будут всегда все теги данной задачи. Т.е. всегда загружать коллекцию тегов для задачи при восстановлении задачи из БД.

    Второй заключается в том, чтобы вынести логику в Service. CA и подобные архитектуры диктуют лишь то, что бизнес логика (БЛ) должна быть первична, а все остальное вторично и подстраивается под БЛ. Но они не ограничивают в средствах выражения, т.е. необязательно чтобы вся БЛ была в методах сущностей. Наоборот, внутри сущностей должна быть лишь простая логика, а все что посложнее выносится в Domain Service-ы.
    Например, можно создать TaskService, в котором будет метод AddNewTagToTask(Tag tag, Task task). Так как это сервис, то здесь можно иметь зависимость на соответствующий репозиторий, и тогда можно проверить наличие тега с помощью него: if (!taskRepository.TaskHaveTag(tag)) { ... }

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

    Но стоит заметить, что если выбран второй подход, то стоит убрать свойство Tags из сущности Task. Так как это будет обманом. Представьте, что вы решили не загружать все теги для задачи, а сделать проверку через сервис. Но в проекте вы работаете не один. Другой же программист увидит что есть поле Tags у задачи и попытается использовать его так, как-будто там там содержатся все теги для задачи. Поэтому чтобы не создавать двусмысленности нужно убрать свойство Tags из Task.
    Ответ написан
  • Как собрать .NET Core проект под ubuntu в один файл?

    @basrach
    Это относится не только к Core под Ubuntu. К обычному .Net под Windows это тоже относится.
    Решают эту проблему добавлением всех зависимостей исполняемого файла (например .exe) в ресурсы этого самого .exe. Затем при запуске приложения регистрируется обработчик события AppDomain.AssemblyResolve, который достаёт нужную сборку из ресурсов, загружает ее в домен и возвращает ссылку на нее среде. AppDomain.AssemblyResolve вызывается каждый раз когда приложению нужна какая-нибудь зависимость.
    Это просто и несложно реализуется, при этом это не займет много времени.
    Также есть и библиотеки, которые встраиваются в процесс билда и позволяют это дело автоматизировать. Выше уже был упомянут ILMerge, также есть Fody, возможно есть еще какие-то аналоги.
    Ответ написан