Ответы пользователя по тегу ASP.NET
  • На каком открытом ASP.NET Web Api 2 проекте поучиться?

    Как пример для начала - https://chsakell.com/2015/08/23/building-single-pa...

    Что бы все было круто, я таких не видел. Показывают одно, забивают на другое.

    Делаю свой на примере выше, +React UI в отдельном проекте. Переделал авторизацию на Identity 2, добавил OWIN. HTML заменил на CSHTML + MVC 5. Убрал кастомную обертку над API, все вызовы сделал async, и другие улучшения.
    Как докручу все выложу на Github.

    Примеры проектов также можно посмотреть тут - https://code.msdn.microsoft.com/

    Вот хороший курс programmingwithmosh.com/become-a-full-stack-dot-ne...
    С самого начала до норм проекта, понятный Английский.
    Ответ написан
    2 комментария
  • Как сформировать список наиболее совпадающих по условию элементов?

    На хабре mail помоему писали статью как у них поиск работает, вы я так понял пытаетесь сделать выборку самых подходящих под запрос пользователя новостей, это тоже самое что делает mail, yandex, google. Их опыт изучить, где что то писали.

    Напишите в гугл запрос
    site:habrahabr.ru mail поиск алгоритм
    Ответ написан
  • Как совместить гармонично совместить теорию и практику на C#?

    У меня наоборот было.
    Начитался про C#, а вот практики мало, и валился на простых вещах.
    Сейчас уже и эти пробелы закрыл.

    Раз книги читал, то сходи на ITVDN курс мидл и проф.
    Просто заучи, повторяй раз в неделю, месяц, полгода заметки из книг.
    Выписывай то что считаешь главным, своими словами.
    У меня набралось на 3-4 часа чтения.
    Но зато это покрывает ~5 книг сразу.

    Коллекция нужна только если используется Add, Remove. Книги то читали, вот например заметки из Jon Skeet C#:
    List - внутренне хранит массив и отслеживает логический размер списка и размер поддерживающего массива. Добавление элемента является либо простым случаем установки очередного значения в массиве, либо (если массив уже заполнен) копированием существующего содержимого в новый массив большего размера (обычно в два раза, т.е. происходит удвоение, но это недокументированно) и затем установки в нем значения. Сложность O(1) или O(n) в зависимости от того требуется ли копирование значений. Удаление элемента из List требует копирования расположенных за ним элементов на позицию назад, поэтому сложность составляет O(n-k), где k - индекс удаляемого элемента. По индексу RemoveAt() удалять значительно быстрее чем по значению Remove(), т.к. во втором случае происходит сравнение каждого элемента где бы он не находился сложность O(n).

    **Массивы** - самый низкий уровень коллекций в .Net. Унаследованы от System.Array, и они единственные имеют прямую поддержку в среде CLR. Массивы всегда изменяемы в терминах своих элементов, но всегда фиксированы в терминах своих размеров.
    Foreach для массива использует его свойство Length и индексатор массива, а не создает объект итератора.

    **LinkedList** - связанный список, каждый элемент которого имеет ссылку на предыдущий и следующий элемент. Быстро можно удалять, вставлять новые элементы, т.к. происходит только изменение ссылок на соседних узлах. Проход по коллекции тоже эффективен, но разумеется нет индекса.

    **Dictionary** - подобно List хранит свои элементы в массиве, со всеми вытекающими по вставке и увеличению размера последствиями. Для реализации эффективного поиска использует хештаблицу. Можно либо применять стандартные функции хеширования и эквивалентности внутри самих объектов ключей, либо передать реализацию IEqualityComparer в аргументе конструктора. Ключи должны быть уникальными, но хешкоды могут совпадать, что снижает эффективность поиска. Словарь даст отказ, если ключи являются изменяемыми и меняют свои хешкоды после того, как были вставлены в словарь. Внутри этого словаря нет гарантии порядка следования элементов, так что рассчитывать на него нельзя. Вставка происходит на основе ключа (что-то вроде индекса), а не последовательности заполнения словаря.

    **ReadOnlyDictionary<,>** - просто оболочка, которая скрывает все изменяемые операции за явной реализацией интерфейса, и генерирует исключение если они все же вызываются. Но если лежащая в основе коллекция (та что передается конструктору) модифицируется, то модификации будут видны через оболочку.


    APS.NET без рефлексии и доменов не работал бы.
    Ответ написан
    3 комментария
  • Как распределить клиентов по серверам?

    1) Посты на хабре о видеохостинге Mail.ru, они подробно описали что и как делают.
    2) https://github.com/quozd/awesome-dotnet#distribute...
    3) getakka.net
    Ответ написан
    Комментировать
  • Трехуровневая архитектура ASP.NET MVC. Где проводить валидацию данных?

    Проверять можно на всех уровнях.
    1) Контроллеры MVC - FluentValidation
    2) Далее все через контракты.
    Через IoC обертываем все в интерфейсы, и далее:
    [ContractClass(typeof(IArrayContract))]
    public interface IArray
    { контракт }
    
    [ContractClassFor(typeof(IArray))]
    internal abstract class IArrayContract : IArray
    { проверка входных и выходных параметров контрактов }


    + проверки на интерфейсах можно включать и выключать на вкладке свойств проекта, 4 уровня проверки.
    + проверки внедряются во все типы реализующие контракт.
    - нельзя просто так взять и перехватить тип исключения от контракта, придется ловить все.

    Из BBL не выкинишь HTTP ошибку, придется либо делать фильтр, либо ловить их в каждом методе и через switch кидать, но это не очень.
    Ответ написан
    Комментировать
  • Как правильно создать валидатор DataAnnotations?

    1) metanit.com/sharp/mvc5
    Глава 7. Метаданные и валидация модели
    Аннотации данных для отображения свойств
    Основы валидации
    Атрибуты валидации
    Валидация модели в контроллере
    Отображение ошибок валидации
    Создание собственной логики валидации


    2) FluentValidation, модель отдельно, валидация отдельно.
    https://chsakell.com/2015/08/23/building-single-pa...

    public class MovieViewModel : IValidatableObject
    {
        public int ID { get; set; }
        public string Title { get; set; }
        public string Description { get; set; }
        public string Image { get; set; }
        public string  Genre { get; set; }
        public int GenreId { get; set; }
        public string Director { get; set; }
        public string Writer { get; set; }
        public string Producer { get; set; }
        public DateTime ReleaseDate { get; set; }
        public byte Rating { get; set; }
        public string TrailerURI { get; set; }
        public bool IsAvailable { get; set; }
        public int NumberOfStocks { get; set; }
     
        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            var validator = new MovieViewModelValidator();
            var result = validator.Validate(this);
            return result.Errors.Select(item => new ValidationResult(item.ErrorMessage, new[] { item.PropertyName }));
        }
    }
    
    public class MovieViewModelValidator : AbstractValidator<MovieViewModel>
        {
            public MovieViewModelValidator()
            {
                RuleFor(movie => movie.GenreId).GreaterThan(0)
                    .WithMessage("Select a Genre");
     
                RuleFor(movie => movie.Director).NotEmpty().Length(1,100)
                    .WithMessage("Select a Director");
     
                RuleFor(movie => movie.Writer).NotEmpty().Length(1,50)
                    .WithMessage("Select a writer");
     
                RuleFor(movie => movie.Producer).NotEmpty().Length(1, 50)
                    .WithMessage("Select a producer");
     
                RuleFor(movie => movie.Description).NotEmpty()
                    .WithMessage("Select a description");
     
                RuleFor(movie => movie.Rating).InclusiveBetween((byte)0, (byte)5)
                    .WithMessage("Rating must be less than or equal to 5");
     
                RuleFor(movie => movie.TrailerURI).NotEmpty().Must(ValidTrailerURI)
                    .WithMessage("Only Youtube Trailers are supported");
            }
     
            private bool ValidTrailerURI(string trailerURI)
            {
                return (!string.IsNullOrEmpty(trailerURI) && trailerURI.ToLower().StartsWith("https://www.youtube.com/watch?"));
            }
        }
    Ответ написан
    1 комментарий
  • Как связать динимически созданые контролы: два dropdownlist и sqldatasourse для них?

    XMLHttpRequest.

    dropdownlist1 - при выборе элемента отправляется запрос, ответ на него помещается в dropdownlist2.
    Ответ написан
    Комментировать
  • Практика ASP.NET MVC?

    metanit.com/sharp/mvc5
    https://chsakell.com/2015/08/23/building-single-pa... - на этом сайте поищи, но WEB API тоже гуд.

    Есть семплы MVC, туториалы. гуглятся.
    Ответ написан
    Комментировать
  • Как лучше реализовать интерфейс и класс?

    Руководство по разработке библиотек классов
    - Правила разработки типов
    --Выбор между классами и интерфейсами
    Ответ написан
    Комментировать
  • Какие решения выбрать для хранения больших обьемов данных ASP.NET?

    ASP.NET это .NET, какие тут могут быть решения?
    Вызывать хранимки ADO.NET или чуть медленнее EF.
    А БД по цене и предпочтению.

    Ничего нового ведь не придумали, что бы не выбрали будет тоже самое но на разном ПО.

    Или есть что то супер скоростное и отличное от этого?
    Ответ написан
    Комментировать
  • Как реализовать регистрацию для организаций с использованием ASP.NET Identity?

    Не архитектор, но может быть так:
    1) Все пользователи в таблице Users.
    2) Все компании в таблице Companies.
    3) Таблица связи между 1 и 2. Пользователь может работать в 1 или более компаний, он может иметь разные атрибуты в разных компаниях (или несколько разных учеток будет, не удобно, если он обновит свои данные только в одной и забудет в других).

    Или
    1) Users отдельно для сущности пользователь. (домашний телефон, адрес)
    2) Company для компаний.
    2) Таблицу Employee для сотрудника компании, у которой будет ссылка на User и Company. (рабочий телефон, должность...)
    Любой User может стать Employee, и может быть им в разных компаниях с разными возможностями.
    Ответ написан
    Комментировать
  • Как правильно проектировать веб-приложение?

    metanit.com/sharp/mvc5
    Глава 23 "Архитектура приложений".

    Есть еще бесплатная книга (большая) на microsoft сайте, гуглится.
    "Руководство Microsoft по проектированию архитектуры"
    Ответ написан
    Комментировать
  • Как правильно использовать Dto объекты?

    На сколько мне известно, есть модели для представления (DTO или xxxViewModel - их видит конечный пользователь и передает в них данные для контроллеров), и есть сущности Entity который уже в базе (делают маппинг между ними).
    Что бы не лепить валидацию, скрывать какие-то поля или добавлять временные, их разделили. Приложение станет безопасней, isAdmin = true не влепят, даже если забудете байдинге убрать свойство.

    Если в контроллер прилетает не сложный объект, DTO делать не обязательно.
    Если сложный, то проще сделать, их все равно много не будет, зато легко валидировать через ModelState.IsValid и атрибуты.

    Вот отличный сайт metanit.com/sharp
    Это просто находка, за пару дней можно ознакомиться со всеми основными моментами по ASP.NET.
    Ответ написан
    Комментировать
  • Как определить права для доступа к сущности?

    Прилетел запрос в контроллер, узнали к какой роли относится авторизованный пользователь, исходя из этого делаем запрос к БД. Не?
    Или пришел запрос от пользователя, запросили в БД какие группы ему доступны, сделали к ним запрос.
    Ответ написан
    Комментировать
  • Как написать LINQ запрос?

    Плохо как то.
    Сравнивать строки надо без учета регистра, что бы "Иван" был равен "ИВАН".

    Строка получается в базе такого типа:
    "Иванов Иван, Петров, Сидоров С., П.Д. Сергеев ... "

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

    Сейчас проблема найти, потом проблема изменить фамилию, потом нужно будет добавить какие то данные, разбить их на группы и т.д.
    Один актер может играть в нескольких фильмах, и сейчас хранится копиями в каждой сущности, легко будет изменить его имя, думаю что нет.
    Нужна связь многие ко многим. И тогда вы сможете находить всех актеров по фильму, и все фильмы по актеру.

    Ошибка возникает в методе ToList() потому что именно он и делает отложенный запрос, который выше в коде был только сконфигурирован но не выполнен.

    Для быстрого решения проблемы здесь и сейчас есть решение на SA -> LINQ to Entities does not recognize the method 'Sy...
    Ответ написан
    Комментировать
  • Как научиться грамотно писать код?

    Visual Studio -> Анализ кода
    d48fb82a6ccf4c39be08cc9a969411e1.pngПрактическое руководство Настройка анализа кода для проекта управляемого кода. Только не включайте все правила сразу, предупреждений будут сотни, включайте по одному, как исправите недочеты (внимательно читая предупреждения на сайте Microsoft), применяйте другие, и так до включения "All".
    Мне эти правила понравились (в каждой компании свои требования к коду), теперь использую везде где пишу сам с нуля.
    Можно использовать StyleCop, но он вроде заброшен, форк есть для Roslyn, но этих хватит что бы научить команду соблюдать практику Microsoft.

    Шаблоны проектирования бесплатная книга, GOF для .NET от сертифицированных специалистов.

    Я понял что этот путь бесконечный, в книгах пишут что люди смотря на свой код написанный год назад "плачут/смеются, говорят - кто это написал." :)
    Испытываю тоже самое.
    Ответ написан
    Комментировать
  • Стоит ли изучать ASP.NET?

    В теме одно, в вопросе немного другое.
    Ответ - стоит, хуже точно не станет.
    Я сначала сам немного противился web`у, а сейчас чувствую себя в нем более уверенно. Это и при анализе чужих web очень помогает.
    Ответ написан
    Комментировать