Ответы пользователя по тегу C#
  • Как получить имя сервера Discord.Net?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Когда пользователь вызывает команду, к тебе на сервер приходит запрос (на вебхук), где указан guild_id, в которой команда была вызвана.
    https://ptb.discord.com/developers/docs/interactio...

    Получить подробную инфу о сервере по guild_id можно соответствующим методом:
    https://discord.com/developers/docs/resources/guil...
    Ответ написан
  • Есть ли аналоги корутин Unity в языке c# и как их использовать?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    На сколько я знаю, корутины в Unity реализованы через IEnumerator и объекты WaitForSeconds.

    IEnumerator и IEnumerable - это стандартные интерфейсы, которые используются для реализации перечислений/коллекций и итераторов.

    А вот ожидание в C# ты можешь получить через метод Thread.Sleep (в синхронных методах) или await Task.Delay (в асинхронных методах).
    Ответ написан
    9 комментариев
  • Где взглянуть на C# проект с "эталонной" архитектурой?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    В общем, условно, такой код, глядя на который, даже самые суровые критики не могли бы найти к чему придраться.

    Всегда можно к чему-то придраться.
    Качество архитектуры можно понять только в динамике - легко ли вносить изменения в продукт, или сложно.
    А так есть eShopOnWeb и eShopOnContainers
    Ответ написан
    Комментировать
  • Как inject Generic interfaces?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Чтобы можно было резолвить обобщённые интерфейсы, тебе нужно их зарегистрировать. Всё также, как и с необобщёнными интерфейсами:
    services.AddScoped(typeof(IFoo<>), typeof(Foo<>));

    Чтобы твой контроллер мог принимать в себя обобщённый интерфейс как параметр - сам контроллер должен быть обобщённым.
    Но тут сразу возникает проблема с тем, как маршрутизировать к такому контроллеру. По тому просто так нельзя так сделать.
    Ответ написан
    Комментировать
  • Как корректно получить данные из SqliteDataReader?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист

    sqlCommandText = "SELECT * FROM table WHERE id='"+Id+"'"; // Смущает +Id+, так вроде не пишут, нужно @?


    Правильно, что смущает.
    1. SELECT * лучше не писать. Лучше писать конкретные поля, которые тебе нужны
    2. Вместо конкатенации следует использовать параметризованные запросы. При использовании EF Core и Dapper их можно делать через интерполяцию, но тут придётся ручками добавлять параметры в свойство Parameters

    using var command = new SqliteCommand
    {
        CommandText = "SELECT id, txt, floating_point, raw_bytes FROM table WHERE id=$id",
        Parameters = {
          new SqliteParameter("$id", 123)
        },
        Connection = new SqliteConnection() // Тут стоит подставить настоящий connection
    };
    
    using var reader = await command.ExecuteReaderAsync(); // Вместо async-await можно использовать и синхронные методы
    var data = new List<(int id, string text, double floatingPoint, byte[] blob>(); // Вместо кортежа можно нормальный тип
    while (await reader.ReadAsync())
    {
      var id = await reader.GetFieldValueAsync<int>(0); //integer
      var text = await reader.GetFieldValueAsync<string>(1); //text
      var value = await reader.GetFieldValueAsync<double>(2); // real
      var blob = await reader.GetFieldValueAsync<byte[]>(3); // blob
      data.Add((id, text, value, blob));
    }
    Ответ написан
    4 комментария
  • Какой паттерн использовать?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Шаблонный

    Шаблонный что?
    итератор

    А что ты итерировать собрался?

    Не нужно тут придумывать название паттерна и пытаться по нему решить задачу.
    Сама задача решается тупо рекурсивным проходом по всем подпапкам.
    В зависимости от того, как конкретно ты будешь это реализовывать, будут наблюдаться разные паттерны.
    Ответ написан
    Комментировать
  • Spring или Asp.net core для будущей работы?

    vabka
    @vabka Куратор тега ASP.NET
    Токсичный шарпист
    Зарплаты примерно и там и там если не одинаковые, то очень близкие.
    Вакансий на Java/Spring больше, чем на C#/ASP NET Core, но во втором случае и конкуренции меньше. В целом проблем с поиском работы нет.

    Я буду жабой, которая хвалит своё болото и предложу углубиться в ASP.NET Core.
    Мне C# кажется более перспективным языком и платформой чем Java. (хотя ещё я бы посмотрел на Kotlin)

    Но тебе всё равно следует посмотреть ситуацию на конкретно твоём рынке труда и принять окончательное решение.
    Учитывай, что ситуация за 3-4 года 10 раз может поменяться.
    Ответ написан
    2 комментария
  • Можно ли получить тип интерфейса, переданного в дженерик-метод и правильно ли использовать его таким способом?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Ну ты можешь сделать так:
    switch(parameter) {
      case IPrintService_IncomeProductLabelParams incomeProductLabel: {
        // ...
        break;
      }
      case IPrintService_WLabelParams wLabel: {
        // ...
        break;
      }
      // итд
      default:
        // ...
      break;
    }

    Но мне не понятен смысл женерика и интерфейсов с пропертями.
    Ты собираешься делать параметры ещё и структурами?
    В принципе тут можно избавиться от интерфейсов вообще и оставить только конкретные классы, а в IPrintService сделать несколько перегрузок, например.
    Или сделать по интерфейсу для каждого типа этикеток.

    Вообще, я у тебя тут вижу три разные вещи у этикеток:
    1. Какой принтер используется (PrinterName)
    2. Параметры задания на печать (Copy)
    3. Параметры самой этикетки. Её тип и, например, SKU товара.
    Попробуй подумать с этой стороны.
    Например ты можешь сделать такой IPrinter, который будет принимать в себя PrintTask, у которого будет написано количество нужных копий и Payload который будет уже самой этикеткой.
    Конкретная реализация IPrinter может быть привязана к одному физическому принтеру.

    А Payload ты можешь формировать отдельно от сервиса печати. Например у тебя может быть какая-нибудь "служба шаблонов этикеток", в которую ты передаёшь объект с параметрами этикетки, а она отдаёт тебе уже сформированный объект этикетки, который пригоден для печати (Что там вообще принтер принимает? Картинку?)
    Ответ написан
  • Как в LibGit2Sharp сделать клон репозитория с заменой файлов?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Вариант раз: Удалить старую папку и сделать git clone.
    Вариант два: Создать новую временную папку и скопировать из неё всё содержимое. Но что делать с самим репозиторием в таком случае - не ясно, как и то, что делать, если файлы есть в обоих папках.
    Вариант три: Как сказал oleg_ods - использовать git pull, чтобы обновить существующий репозиторий
    Вариант четыре: Создать новую папку, чтобы её имя не совпадало со старой, и клонировать репозиторий в неё.
    Ответ написан
    4 комментария
  • Считать ли класс, который реализует extern-методы, адаптером?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Сложно сказать, есть ли у такого паттерна название. А это важно?
    Подобные штуки обычно обёртками называют
    Ответ написан
  • Где можно посмотреть проекты близкие к реальным по ASP.NET?

    vabka
    @vabka Куратор тега ASP.NET
    Токсичный шарпист
    eshoponweb и eshoponcontainers.
    Ещё, думаю, можешь посмотреть на какие-нибудь опенсорсные проекты. Например на SunEngine
    Ответ написан
    Комментировать
  • Как стримить кучу картинок с минимальной латенси?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист

    Захватывать картинки - есть либа и это вроде не сложно, но с веб апи я работал с обычными запросами, если я буду отправлять 24 картинки в секунду, даже разрешения 640 на 480 через пост запросы, это, блин, очень много запросов ) там не известно, какие-то кадры могут раньше приехать, какие-то зависнуть по разным причинам.

    Я бы посмотрел в сторону grpc streaming - там можно 1 раз открыть соединение и отправлять много сообщений + не нужно в base64 кодировать.
    Либо вообще подумал над собственным протоколом поверх tcp.

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

    Нашёл ещё вот такую статью:
    https://www.codeproject.com/Articles/810004/Live-V...
    Ответ написан
    2 комментария
  • Mapping со сложной структурой?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    User user = null!;
    var userDto = new AllUserDataDto {
      TelegramUserIdDto = user.TelegramUserId,
      Steam = user.Accounts.Select(x => 
          new Steam {
            SteamIdDto = x.SteamId,
            Skins =  x.Items.Select(i=> new Skin { NameDto = i.MarketHashName  }
        })
        .ToList()
    };


    Кстати, а какой сакральный смысл в добавлении суффиксов Dto к именам свойств?
    Ответ написан
  • Как заоверлоудить Join одного параметра?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    На самом деле тебе нужен string.Join(",", source)
    Ну либо тебе нужен вот такой екстеншен:
    public static class StringExtensions {
      public static string Join<T>(this IEnumerable<T> parts, string separator) => 
        tring.Join(separator, parts);
    }
    Ответ написан
    Комментировать
  • Как из сайта по ссылке засунуть его в приложение на c#?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Тебе нужно сделать десктопное приложение при помощи Winforms, WPF, или Avalonia, и добавить в окно Webview, в котором открыть этот сайт.

    Добавить webview ты можешь при помощи Webview2 или CEF
    Ответ написан
    1 комментарий
  • Как отследить выход из игры UNITY?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Столкнулся я с вопросом "А как узнать, что игрок закрыл игру принудительно, не используя кнопку "Exit"?

    Ну например ты можешь при нормальном закрытии записывать какой-нибудь флаг в файл, типа "игра была закрыта нормально".
    Тогда при следующем запуске, обнаружив, что этот флаг не стоит - ты поймёшь, что в прошлый раз игра закрылась непредвиденным образом (принудительно или из-за отключения электричества)

    Также, было бы весело решить данный вопрос, если вы ответите на похожий вопрос "Как узнать время проведенное в афк?",

    Ну тут тебе сначала нужно дать определение, что такое афк в твоём случае :)
    К примеру, можно считать, что игрок отошёл, если от него не поступает сигнал N единиц времени.
    Тогда чтобы узнать время нахождения в афк - тебе нужно просто сохранять метку времени каждый раз, когда игрок как-то взаимодействует с игрой, а потом отнимать от последнего записанного времени N.
    Ответ написан
    2 комментария
  • Зачем нужен IHost и когда его полезно использовать в desktop-приложениях?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист

    Вроде бы IHost интерфейс появился как попытка унификации любого микросервиса и должен облегчать межсервисное взаимодействие и контейнеризацию. Поправьте, если я заблуждаюсь

    Как попытка унификации - да.
    Как попытка упростить межсервисное взаимодействие - нет.

    Главная задача IHost - упростить конфигурацию приложения и управление жизненным циклом (тот же graceful shutdown например тебе даётся из коробки, если ты используешь IHost)
    + Сразу автоматически получаешь преднастроенный IConfiguration, логирование и DI
    Ответ написан
    2 комментария
  • Можно ли вместо Delete-метода использовать POST?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Да, так можно сделать.
    Только не сервере не забудь код поправить.

    Если бы серверную часть писал я, то я бы подумал над редизайном этой апишки, ибо принимать кучу query-параметров для удаления - это странно и не соответствует идеям rest.
    Ответ написан
    Комментировать
  • Какое решение задачи по циклам будет правильным?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    1. Определяемся с тем, что от нас хотят. Требования можно представить в виде такого псевдокода :)
    повторять всегда {
       сообщение = прочитать();
       если сообщение = "EXIT" то выйти;
       сообщение2 = прочитать();
       если сообщение2 = "EXIT" то выйти;
       количество_повторений = прочитать_число(сообщение2);
       повторять количество_повторений раз {
         напечатать(сообщение);
       }
    }


    2. Переводим буквально на C#:
    while(true) {
      Console.WriteLine("Введите сообщение");
      var message = Console.ReadLine();
      if (message == "EXIT") {
        return;
      }
      Console.WriteLine("Введите количество повторений");
      var message2 = Console.ReadLine();
      if (message == "EXIT") {
        return;
      }
      var count = int.Parse(message2); // по хорошему, надо бы как-нибудь обработать, если пользователь ввёл не число. В таком виде программа просто упадёт.
      for(var i=0; i<count; i++) {
        Console.WriteLine(message);
      }
    }
    Ответ написан
    Комментировать