• Туториалы что-то не помогают, как правильно работать с докером для .net core?

    Jeer
    @Jeer Автор вопроса
    Сергей В, Спасибо большое, теперь я похоже догнал
    Когда читал про докер, везде пишется, что образ собирается по слоям, берется базовый образ и на него накручиваются слои. Эта парадигма сильно укрепилась в голове.
    Теперь я нашел, что команда FROM не относится к этим слоям, а считается как многоступенчатая сборка, то есть, имея несколько инструкций FROM мы копируем какие-то только необходимые артефакты, избавляясь по прохождению этих шагов от ненужного. Тут было не очевидно, что в результат попадет только последний шаг.
    Получается, что на размер образа не будет влиять, сделаю ли я сборку на своей тачке и засуну в докер только нужные файлы из папки паблиша, либо внутри докера сделаю многоступенчатую сборку, окей
    Создайте отдельный ответ, отмечу его решением
  • Туториалы что-то не помогают, как правильно работать с докером для .net core?

    Jeer
    @Jeer Автор вопроса
    Окей, вот я открываю официальную документацию, там есть пункт, что можно сделать отдельно дотнет паблиш и с него собрать докер имадж, который можно использовать.
    Но ниже идет раздел The Dockerfile, в котором описывается, что мы сначала должны ставить sdk, затем билдить, после этого делать паблиш и уже это использовать. Это лишние 200 метров, об этом я и спрашиваю, зачем? Даже на винде я могу сбилдить приложение под линукс или арм, под x86 или x64 и загрузить только необходимые файлы в докер-образ. Тут же в официальной документации (которая потом везде просто копируется) говорят, что нужно билдить внутри докер-контейнера. После билда ненужные файлы не чистятся, это увеличение итогового образа более, чем в 2 раза. Типа всем плевать на объем образа или что?
  • Процесс разработки фуллстэк проекта на Js?

    Aetae, уж в реакте-то побольше костылей ) и каждый разработчик еще ворох своих привносит. Каждый проект не похож вообще на чужой проект и у большинства через жопу )
  • Как правильно сравнивать record-ы с byte[] внутри?

    Jeer
    @Jeer Автор вопроса
    Дописал ответ комментом к ответу Василия, действительно, там нужно реализовывать и Equals и даже в методе GetHashCode пришлось кастовать на другой тип, иначе тоже не работало. Как по мне, неудобно использовать, типа всё равно постоянно кастит под капотом в другие типы
  • Как правильно сравнивать record-ы с byte[] внутри?

    Jeer
    @Jeer Автор вопроса
    Ага, убрал struct так как всё равно нужно это дописывать, вот такое получилось в итоге
    private record DeserializerKey(byte[] contentType, byte[] contentEncoding)
        {
            public virtual bool Equals(DeserializerKey? other)
            {
                if (other == null) return false;
                return this.contentType.SequenceEqual(other.contentType) &&
                       this.contentEncoding.SequenceEqual(other.contentEncoding);
            }
    
            public override int GetHashCode()
            {
                return HashCode.Combine(new BigInteger(contentType), new BigInteger(contentEncoding));
            }
        };


    Конечно, я ожидал, что будет из коробки работать без лишней писанины, ну ладно
  • Как правильно выносить общую часть из компонентов реакт?

    Jeer
    @Jeer Автор вопроса
    пропс тогда должен получиться что-то вроде такого?
    {
      type: 'user' | 'priority' | 'date' | 'string';
      userId?: number;
      priorityId?: number;
      date?: Date;
      content: string;
      labelText: string;
      bWidth: string;
    }


    Затем добавлять свитч или тип того, мне кажется очень плохой дизайн
  • Как правильно выносить общую часть из компонентов реакт?

    Jeer
    @Jeer Автор вопроса
    Aetae, я только начал разбираться с реактом, похоже, что это основы основ. Было два варианта, children или дженерики. С children мне непонятно как передавать готовые компоненты в этот компонент и как правильно завести тип данных, допустим этот общий компонент с версткой будет называться BootstrapCol, тогда должно получиться что-то вроде такого?
    <BootstrapCol bWidth="col-lg-3" labelText="Priority">
      <PriorityCol priorityId={epic.priority} />
    </BootstrapCol>
    <BootstrapCol bWidth="col-lg-3" labelText="Reporter">
      <UserCol userId ={epic.reporter} />
    </BootstrapCol>


    Можно как-то более изящно сделать или вот так по итогу и должно получиться и это самый норм? Какой тип у children ставить?
  • Почему не используют NoSql решения на каждого пользователя?

    ну про логи и мониторинг фигня - сейчас же у всех "микросервисы" и там нормально делается сквозное логирование для всех сервисов и в принципе все логи сливаются в один сервис для логов типа кибаны
  • Почему не обновляется страница react-context?

    Jeer
    @Jeer Автор вопроса
    Привет, я как раз и уточнил, что у меня не получилось изменить весь объект. Когда протягиваю контекст, то объект внутри ридонли, я не могу его изменить
  • Использовать ли Microsoft Identity для авторизации web api?

    Привет,
    Я не претендую на истину, просто из последнего примера (сейчас в процессе перепиливания)
    Есть кастомный сервис с методами работы с базой, я там разделил пользователя на две таблицы (один к одному) системного юзера и профиль. Роли веду без базы просто в енуме, у пользователя есть массив ролей. (Ну и еще игрался с тем, что пользователь может заходить по никнейму, почте или телефону, возможно это кривовато)
    Обычный контроллер, с тремя методами. Посмотрите снизу как реализован метод SignInAsync, там стандартное использование клаймсов из Security.Claims, в которые я засовываю гуид пользователя и массив доступных ролей и SignInAsync из AspNetCore.Authentication.
    Подключается по классике всё в стартапе (в новой версии языка уже в Program.cs)
    services
        .AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
        .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, o =>
        {
            o.Cookie.HttpOnly = true;
            o.Events = new CookieAuthenticationEvents
            {
                OnRedirectToLogin = redirectContext =>
                {
                    redirectContext.HttpContext.Response.StatusCode = 401;
                    return Task.CompletedTask;
                }
            };
        });
    
    // ...
    
    app.UseAuthentication();
    app.UseAuthorization();


    Вопрос про изменение аутентификации, у меня на основе кукисов. Если бы я захотел перейти на авторизацию по токенам, то нужно было бы добавить метод получения токена в контроллере, в стартапе, собственно, изменить схему примерно так:
    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                        .AddJwtBearer(options =>
    ...

    Ну и видимо добавить метод расширения, который вытаскивает гуид пользователя из клаймов, так как это уже используется. То есть, довольно быстро можно дописать необходимое.
    Что за паттерн-мишура я не понял )
    В итоге, получается, что у меня своя реализация таблиц в базе, но, тем не менее, я пользуюсь стандатными средствами работы с кукисами, клаймсами и прочим необходимым. Если бы мне не требовалось менять схему в базе, можно было использовать идентити контекст и какой-то стандартный контроллер, я не уверен в каком это сейчас состоянии и как с этим работать, но там не должно быть чего-то сложного
  • Как правильно подключить метрики c#?

    Jeer
    @Jeer Автор вопроса
    ой, вижу через new создание ) хз, короч, из туториала выдрал, если убрать статик, то не получается создать каунтер, например
    public readonly Meter OutboxMeter = new("Dodo.Kafka.Outbox");
        public readonly Counter<int> OutboxPublishCounter = OutboxMeter.CreateCounter<int>("outbox-publish");
    // Cannot access non-static field 'OutboxMeter' in static context
  • Как правильно подключить метрики c#?

    Jeer
    @Jeer Автор вопроса
    freeExec, строки в базе данных которые? Они всегда меняются извне )) Ну, если запущено, например, два экземпляра приложения, это считается, что они меняются извне? )
    OutboxMeter я сделал статичным, чтобы помимо вот этого инструмента в других местах можно было добавлять ещё что-то, например, скорость паблиша в очередь из этой таблицы. Хотя я глянул, он в принципе должен быть статичный, я же его не через new создаю, а работаю через фабрику
  • Как правильно подключить метрики c#?

    Jeer
    @Jeer Автор вопроса
    CreateObservableGauge не так работает, он принимает функцию, которая выполняется в зависимости от настроек экспортера, например, раз в 15 секунд. Если я у себя буду вначале вычислять количество строк, тогда мне нужно будет добавить еще какой-то бесконечный цикл со своим таймером (который не совпадает с таймером экспортера) и вообще, сбор метрик может быть не настроен, тогда в правильном варианте эта функция вообще не будет вызываться, а в вашем варианте всё равно будет свой бесконечный цикл. В общем, это нерабочий вариант
  • Как правильно подключить метрики c#?

    Jeer
    @Jeer Автор вопроса
    что еще за подходящий момент? так я не могу из статичного поля вычислить размер таблицы, ошибка та же
    private static int GetLength => _repository.GetLength().GetAwaiter().GetResult();
    // Cannot access non-static field '_repository' in static context
  • Как начать изучать ASP.NET Core?

    У меня в словах не было ни шуток, ни подколок.
    Первое. На метаните есть справочная информация, а есть руководства по разным технологиям. Например, можно писать MVC приложение, это когда на бекенде формируется html верстка и клиенту отправляется готовая страница. Может быть на бекенде будет только api, а визуальная часть будет формироваться отдельным решением ангуляр или реакт, такие руководства тоже есть на метаните. И их достаточно.
    Второе, еще раз повторюсь, что чтобы написать приложение его нужно начать писать. Вопроса "Писать свое приложение не зная в какую сторону копать" - не существует. Что именно копать, что не получается? Когда у вас есть задача (проект) вы понимаете, какие данные для работы этого приложения нужны, можете сделать схему базы данных. Какую базу данных использовать уже конкретный вопрос, раньше все работали с ms sql, сейчас многие работают с postgres или my sql. Как создать базу и как она будет взаимодействовать с вашим сервером - есть несколько вариантов и все они есть на метаните. Как на бекенде написать запросы к базе - так же есть несколько вариантов, все рабочие и так же есть на метаните. Затем эти данные отрисовываются, для этого есть рейзор, ангуляр или реакт, всё работает, всё есть на метаните.
    В общем, напишите для себя ТЗ, что вы хотите видеть от приложения. Затем выберете руководство на метаните по заинтересовавшим технологиям и по нему пилите своё приложение.
  • Что лучше, развернуть фронтенд и бакенд на одном домене или разных субдоменах?

    а про сервера в вопросе не было ) оно и на одном домене может находиться на разных серверах (nginx, балансер)
  • Как сделать интеграционные тесты изящными?

    Jeer
    @Jeer Автор вопроса
    Привет, вот смотри, у меня в апи есть контроллер, который по сути обычный CRUD: есть метод Create, ему не нужно подготавливать данные в базе, есть метод Details, для которого должна быть одна запись и метод List, который получает список записей. То есть подготовка исходных данных для тестирования метода не общая и её нельзя поместить в конструктор.
    Каждый метод изолированный, поднимается своя InMemory DB, так что чистить там ничего не нужно.

    Вопрос про подготовку данных, в туториале предлагают способ для подготовки базы, я привёл его, и там прям много строк. Самое главное, что инсерты в базу встроены внутрь переопределения самой фактори через WithWebHostBuilder и тут даже если я этот код вынесу в отдельный метод, я этот метод не смогу дальше нигде переиспользовать.
    var client = _factory.WithWebHostBuilder(builder =>
            {
                builder.ConfigureServices(services =>
                {
                    var sp = services.BuildServiceProvider();
    
                    using var scope = sp.CreateScope();
                    var scopedServices = scope.ServiceProvider;
                    var db = scopedServices.GetRequiredService<ApplicationContext>();
    
                    // Тут можно работать с базой. В туториале код выносится в static файл, куда передаётся контекст
                    // Это уже не очень хороший вариант, но что больше напрягает,
                    // Остальной код вокруг подразумевается дублировать в каждом методе
                });
            }).CreateClient();


    Интересует то, как люди с этим работают, как и в каком формате хранят Arrange, как делают красивое использование в методах? Быть может есть какие-то примеры / шаблоны проектирования / общие рекомендации. Быть может вынести этот класс куда-то в одно место, попытаться сделать его дженериком или пробросить в него только экшены для базы. Сами модели хранить не в статик файлах, а в каких-нибудь снимках или тип того