Ответы пользователя по тегу .NET
  • Зачем нужны WCF?

    И да и нет. Тоже для обмена данными между приложениями, но не обязательно с использованием REST-архитектуры.

    WCF он больше про классические веб-сервисы на базе XML и SOAP. Хоть в WCF и есть возможность создания HTTP REST сервисов, сложно сказать что WCF под них заточен.

    В основном этот фреймворк ориентирован на разработку приложений на базе группы стандартов WS-*, например таких как WSDL, WS-Addressing и WS-Security. Это объёмные стандарты, написанные для обеспечения взаимодействия классических веб-сервисов (см. нулевой уровень, swamp of POX в Richardson Maturity Model ).

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

    Классические веб-сервисы многими недолюбливались, в частности потому что:
    а) REST-ом как правило и не пахнет, HTTP как правило использовался исключительно как транспорт для RPC: т.е. вместо GET/PUT/POST/DELETE/.. всегда вызывался POST с параметрами запроса в его теле. Цитата из ссылки:
    These services have a single URI, and use a single HTTP method (typically POST). For example, most Web Services (WS-*)-based services use a single URI to identify an endpoint, and HTTP POST to transfer SOAP-based payloads, effectively ignoring the rest of the HTTP verbs.

    б) стандарты группы WS-* очень сложные, все технологии на их основе просто не могут быть простыми (как и в частности WCF). Да, есть свои плюсы вроде "могу вызвать что угодно у кого угодно по какому хочешь протоколу", но не всегда такая гибкость была реально нужна.

    Уже давно в многих новых системах наблюдается сдвиг к REST-архитектуре, как к более масштабируемой и простой для потребления клиентом, и, следовательно, протокол HTTP используется по прямому назначению, а не тупо как транспорт для сообщений. А там где REST неудобен/излишен и где RPC лучше походит, проще взять для этого более легковесный протокол или вообще поднять свой на базе какого-нибудь protobuf, как делают во многих игровых проектах.

    Соотв-но WCF сегодня реже выбирают для разработки новых проектов, т.к. для него HTTP REST сервисы немного не "родные". Удобнее взять другие фреймворки вроде ASP.NET Core или Nancy.
    Ответ написан
    Комментировать
  • Миграция проекта с WindowsForms на .NET Core. Куда смотреть?

    Nipheris
    @Nipheris Куратор тега C#
    Это абзац. Вам нужно многое узнать, я вам скажу.

    Во-первых, реализовать "в браузере" - вы вообще понимаете что вам в принципе нужно будет делать и какие компоненты на чём писать? "frontend-разработка", "backend-разработка" вам говорит о чём-то?

    Вам надо смотреть в сторону понимания того, какую логику приложения следует выполнять на сервере (и вы сможете её писать под .Net Core), а какую - на клиенте (и тут .Net Core в общем-то не при чём).

    Ну и да, я надеюсь вы понимаете что .NET Core и ASP.NET Core - это не одно и то же, и "делать веб-приложение на .NET Core" - весьма расплывчатое утверждение. Что оно вообще для вас значит?
    Ответ написан
    2 комментария
  • Как посчитать координаты для дерева?

    На вашей картинке некий нелистовой узел располагается посередине того интервала (по оси X), который занимают его дочерние узлы.

    Поэтому решите задачу определения того, сколько места должны занимать дочерние узлы, включая все их дочерние узлы и т.д. Эту задачу можно решить алгоритмом ПВГ-обхода дерева, управляя стеком вершин вручную или же пользуясь рекурсивными вызовами процедуры обхода.
    Ответ написан
    8 комментариев
  • Как создать команду и организовать современный процесс разработки на C#/.NET?

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

    Ну вот с гита и начните - он вам даст нормальные возможности и для тестирования и для CI.
    Вы можете сказать - гит штука гибкая, нужно иметь какие-то требования к организации процесса чтобы подстроить под себя. Это верно, поэтому пока будете объяснять людям чем гит может быть полезен, сами поймёте что вам нужно.

    Современный процесс разработки диктуется не языком и даже не платформой, а требованиями бизнеса к гибкости, коротким релизам и быстрому MVP, а также пониманием того, что "если они могут выкатываться 2 раза в день - то и нам бы надо почаще, чем раз в 3 месяца".
    Ответ написан
  • Использование итераторов foreach?

    Nipheris
    @Nipheris Куратор тега C#
    Не должно быть duck typing в строго типизированном языке.

    Это не duck typing, это структурная типизация. Проверки, как вы могли заметить, выполняются во время компиляции, а не выполнения - где ж тут duck typing? А то что наследоваться не обязательно от опр. интерфейса - так что ж тут плохого? Язык даёт синтаксический сахар в виде foreach, задача компилятора - сгенерить код, содержащий вызовы определённых методов с определённой сигнатурой, не более. Это задача именно что для структурной типизации, когда компилятору без разницы что у вас там за класс и какие у него интерфейсы, лишь бы можно было сгенерировать нужный код, и это правильно.
    В конце-концов шаблоны в C++ работают точно также. И for-range циклы в C++ работают похожим образом (требуют чтобы были реализованы нужные методы, или свободные функции, принимающие аргумент нужного типа). В C# советуют реализовывать интерфейс, т.к. это даёт дополнительные возможности: а) передавать объект туда, где ожидается этот интерфейс (т.к. C# всё таки в основном язык с номинативной типизацией); б) контролировать что вы не забыли ничего реализовать.

    Прочитал, но по факту, класс всё равно реализует IEnumerable, просто явно об этом не заявляет.

    Не соглашусь, довольно спорный момент. Номинативная типизация говорит, что если только явное заявление о том, что мы реализуем какой-то интерфейс, даёт нам отношение is-a между классом и интерфейсом. Если мы НЕ говорим, что реализуем IEnumerable, то мы его НЕ реализуем, даже если у нас там такие же методы.

    И да, разберитесь заодно в разнице между статической и строгой типизацией, если вы не оговорились в комментарии, а действительно не понимаете разницы.
    Ответ написан
  • Как несколько раз записать в List массив с одним и тем же именем но разными значениями?

    Nipheris
    @Nipheris Куратор тега C#
    Конечно у вас будет один и тот же массив, вы ведь его один раз создали снаружи цикла.

    В C# массив - ссылочный тип. Это значит что ваша переменная anyArr хранит в качестве значения ссылку (!) на массив. Если вы скопируете значение переменной, что вы по сути делаете в строке arrList.Add(anyArr); вы скопируете эту самую ссылку на массив, но не сам массив (в результате ссылка на один и тот же массив будет помещена в список 6 раз).

    Если хотите иметь 6 разных массивов - создавайте их в цикле, или копируйте исходный, смотря что вам нужно делать. В любом случае, вам нужно 6 разных объектов типа object[] .

    Затем читайте про типы-значения и типы-ссылки в C#.
    Ответ написан
    2 комментария
  • Как сделать запрет на редактирование файла для второго пользователя если его открыл первый пользователь?

    Nipheris
    @Nipheris Куратор тега C++
    https://msdn.microsoft.com/en-us/library/system.io... - значение этого параметра нужно выставить в Read. Не стоит велосипеды городить, стоит изучить стандартную библиотеку.
    Ответ написан
    Комментировать
  • Как принято у программистов: использовать для переменной свойство или давать параметр в каждом методе?

    Два примера решения одной задачи

    Это не одна и та же задача, это разные задачи. В первом случае результат вызова метода зависит от состояния объекта, во втором случае - зависит от переданных в него параметров. В первом случае класс инкапсулирует состояние, во втором случае класс вам не нужен.

    Это настолько разные примеры, что даже непонятно, как вам эту разницу объяснить.
    Ответ написан
    Комментировать
  • Как изменить тип параметра в унаследованном методе C#?

    Nipheris
    @Nipheris Куратор тега C#
    То, что вы просите, невозможно сделать по одной простой причине. Наследование в .NET бывает только "настоящее", т.е. когда устанавливается отношение is-a. Ваш MyTCPStream не может быть Stream-ом, если не реализует метод Read (Byte[], Int32, Int32). Спросите себя - что произойдёт, если я скастю объект MyTCPStream к Stream, и попытаюсь вызвать Read(Byte[]...)?

    Вы конечно можете в теле метода бросить InvalidOperationException, но это однозначно признак неверно выбранной абстракции. Лично я не понимаю, зачем вам мог понадобиться TCPStream, из которого вы читаете не байты, а символы.

    Для реализации процесса чтения более сложных объектов (а символ это более сложная штука, т.к. его представление в потоке зависит от кодировки) в дотнете есть TextReader и его наследники. Было бы хорошо, если б вы описали изначальную задачу - возможно мы посоветуем вам что-то полезное, а не странные хаки.
    Ответ написан
    3 комментария
  • Где почитать информация по провайдерам данных?

    ODP.NET это надстройка над ADO.NET?

    Ну у вас и каша в голове, неудивительно, что вы ничего не можете найти.

    ADO.NET - это прежде всего набор интерфейсов, обеспечивающих написание кода, работающего с реляционными данными таким образом, что он минимально зависит (или не зависит вообще) от конкретной используемой СУБД. ADO.NET это далеко не первая попытка унифицировать интерфейс доступа к базам данных (хотя бы к реляционным), многие крупные вендоры это делали, тот же Борланд.

    С момента появления дотнета как платформы ADO.NET был и остаётся основным способом доступа к реляционным БД из дотнет-приложений. В большинстве случаев нет причин НЕ пользоваться им. Стоит отметить, что хоть сейчас MS советует использовать ORM (с тех пор, как повзрослел Entity Framework) для доступа к данным, ADO.NET никуда не девался, т.к. все известные мне ORM-ми работают также через эти интерфейсы.

    Провайдеров данных существует множество, и существование каждого из провайдеров определяется существованием конкретной СУБД. ODP.NET это не надстройка над ADO.NET, это реализация интерфейсов ADO.NET, способная взаимодействовать с Ораклом. Аналогичные провайдеры существуют и для других популярных СУБД, включая PostgreSQL, DB2, MySQL и даже SQLite. По сути доступность реляционной СУБД на дотнете определяется наличием работоспособного ADO.NET-провайдера.

    Разумеется, конкретный провайдер может добавлять какой-то специфичный функционал, но при этом он должен реализовать все необходимые интерфейсы. Фишка ADO.NET в том, что реально написать такое приложение (разумеется, если пользоваться только стандартными SQL конструкциями), которое ВООБЩЕ не будет зависеть от конкретной СУБД вплоть до того, что нужного провайдера можно будет указывать в конфиг-файле.

    Большинство интерфейсов и классов ADO.NET находятся в пространстве имён System.Data. Условно они делятся на собственно интерфейсы для доступа к БД (важнейшие из них: IDbConnection, IDbCommand, IDataReader) и классы-хелперы, в частности набор классов для организации простейшей in-memory базы данных внутри вашего приложения, которая будет служить кэшем для данных, взятых из основной БД (важнейшие классы: DataSet, DataTable).

    Слышал что есть управляемые и неуправляемые провайдеры данных, в чем отличие?

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

    Почитать об этом можно в любой нормальной книжке по дотнету. Если остались вопросы, пишите в комментарии.
    Ответ написан
    3 комментария
  • Как стать профессиональным разработчиком WPF?

    Nipheris
    @Nipheris Куратор тега C#
    А у MVVM нет общих правил, каждый реализовывает его по-разному.

    Ну я б не говорил, что их прям нет. Есть привязки, есть INotifyPropertyChanged, есть рекомендации от MS. Да, вы правы в том смысле, что WPF это библиотека, но НЕ фреймворк для разработки, т.е. она не регламентирует структуру приложения.

    И у меня диссонанс — что сначала изучать, куда копать, что вообще делать, что стоит изучать, а что нет.

    Вот пару дней назад советовал книгу: Raffaele Garofalo, "Building Enterprise Applicatio... - если ничего не читали еще, начните с неё.

    И действительно хороших, многофункциональных и понятных проектов на WPF + MVVM я не видел.

    Неудивительно: WPF-приложения это обычно line-of-business, а это не open-source по определению.

    С чего начать изучение WPF?

    Убедитесь, что более-менее понимаете платформу .NET и ООП в ней, иначе будет тяжело.
    Вам надо будет разобраться:
    а) с системой зависимых свойств (dependency property);
    б) c MVVM и INotifyPropertyChanged;
    в) само собой с XAML и контролами, принципами написания своих контролов;
    г) со стилями и стилизацией;
    д) с системой команд (ICommand) и прочим.

    Нужны ли MVVM-фреймворки? Почему столько дискуссии возникает. Одни говорят да, другие — нет.

    Дискуссии возникают потому что а) некоторые вещи можно сделать разными способами; б) разработчики имеют дело с приложениями разного размера и сложности, но редко об этом задумываются в спорах; в) опытные разработчики нередко сами себя уже обеспечили нужным "библиотечным" пока разрабатывали приложения (ViewModelBase, хах :) ). Лучше пока разберитесь сами как что работает, потом поймете, какой фреймворк вам пригодится.

    Впоследствии еще советую познакомиться с IoC-контейнерами, если еще не пользовались. Это общий совет для крупных приложений, не только для WPF. Некоторые имеют спецальные интеграционные библиотеки для работы на пару с фреймворками, например Autofac: Prism.Autofac.
    Ответ написан
    1 комментарий
  • Как правильно реализовать проект на .NET (WPF Desktop)?

    - не надо ли переписать каждый UserControl в свой отдельный проект (.dll) и после этого тягать его в основное окно?

    Проекты лучше делать по подсистемам или крупным компонентам в проекте, с учётом имеющихся зависимостей. Не видя вашей ситуации сложно посоветовать конкретное решение, но во всяком случае врядли каждый контрол стоит пихать в отдельный проект.

    - что в общем можно прочитать про корректную архитектуру приложения (насколько я понял, вопрос именно по этой теме)?

    Raffaele Garofalo, "Building Enterprise Applicatio...

    - хотелось бы начать работать с версиями своего проекта. Visual Studio Team Services вроде как подходит, откуда начать изучение данного сервиса?

    Лучше начните с Git. Можно конечно поработать и со Студийным контролем версий, но раз уж вы не работали еще вообще ни с чем, гит будет более универсальным скиллом ввиду его подавляющей популярности. И да, самое главное - вам не обязательно будет сразу пользоваться каким-то сервисом, проект можно версионировать и у себя на машине, и залить в VSTS при необходимости. Удивительно, как вы до сих пор не пользовались никакой VCS, видимо вы аккуратный и терпеливый человек)

    Да, убедитесь что вы разобрались с MVVM. Может быть стоит подобрать фреймворк или самому собрать базовую библиотеку, если уже есть наработки.
    Ответ написан
  • Чем разбирать на составляющие аудиофайлы?

    Nipheris
    @Nipheris Куратор тега C#
    Ответ написан
    Комментировать
  • Как читать и записывать xlsx стандартными средствами .NET?

    Nipheris
    @Nipheris Куратор тега C#
    Если вас интересует xlsx, можете стандартными средствами его распаковать (т.к. это обычный ZIP), и поработать с содержимым. Основное содержимое книги будет в XML (не помню имя файла), так что сформировать его особых проблем не составит. Если вариант подходит, расскажу подробнее, что можно сделать.

    А вообще EPPlus тащит.
    Ответ написан
    1 комментарий
  • Как информировать сообщество о новой библиотеке?

    Nipheris
    @Nipheris Куратор тега C#
    1. Делаете хороший README, разумеется на английском, где указываете, как ей пользоваться, и что ей требуется.
    2. Делаете несколько примеров (именно рабочий код в подпапке examples) для основных кейсов применения библиотеки.
    3. Льете на опенсурсный хостинг, если еще не сделали.
    4. Настраиваете CI (например на AppVeyour), это не обязательно, но желательно.
    5. Заливаете готовые пакеты на NuGet. Разумеется, вы должны научиться упаковывать свою библиотеку в нормальный пакет. В nuspec ставите годные правильные теги.
    6. Покрываете тестами, хотя бы частично.

    После этого к вашей библиотеке начнут относиться более-менее серьезно.

    7. Можете попробовать на CodeProject рассказать, там часто рассказывают именно про библиотеки.
    Ответ написан
    4 комментария
  • Как запрашивать аутентификацию для каждого запроса в WEB API?

    1. Аутентификация выполняется однократно. Это довольно сложный, потенциально многоэтапный процесс. Делать аутентификацию при каждом запросе - 100% неверное решение, этим просто невозможно будет пользоваться.
    2. Т.к. аутентификация выполняется однократно, то в качестве метки для всех запросов от некоторого аутентифицированного юзера используется некий токен. Это может быть ID сессии, приходящий в куках, это может быть и JWT, посылаемый в хереде Authorization. Вот этот токен и нужно проверять каждый раз. Суть этого токена в том, что он а) так или иначе временный (хотя может продлеваться тем или иным образом); б) не связан с конкретным методом аутентификации. Т.е. он представляет собой конкретную успешно проведенную аутентификацию. С некоторой натяжкой это можно назвать "сессией". Проверять этот токен ГОРАЗДО легче, чем делать новую аутентификацию - либо просто нужно найти сессию в списке (ну и проверить IP на всякий случай) в случае ID сессии, либо проверить валидность подписи в случае JWT токена. Как это делать - зависит от конкретной реализации этого токена, если скажете что используете - попробую подсказать, что надо проверять.
    3. Насчёт фильтров авторизации - уточните версию ASP.NET, тогда поглядим.
    Ответ написан
    Комментировать
  • В чем разница между C#, .NET, ASP.NET, WEB Forms?

    Nipheris
    @Nipheris Куратор тега C#
    C# это Java.
    .NET это CLR и различные библиотеки (какие - зависит от формы поставки .NET, например .NET Framework, Silverlight или .NET Core).
    CLR это JVM.
    CIL это байткод Джавы.
    ASP.NET MVC это Spring.
    ASP.NET Web Forms это тоже веб-фреймворк, только с другой идеологией (более старый, чем MVC).

    Что для чего нужно и что за умное словечко "платформа"?

    Непонятен контекст.
    Ответ написан
    5 комментариев
  • Как исправить ошибку "Поставщик "Microsoft.Jet.OLEDB.4.0" не зарегистрирован на локальном компьютере."?

    Nipheris
    @Nipheris Куратор тега C#
    Ставьте в свойствах проекта галочку Prefer 32-bit и радуетесь. Ну или ставите 64-х битную версию провайдера Access.
    Ответ написан
    1 комментарий
  • Как в Window динамически добавлять Pie Chart ( WPF C#)?

    Nipheris
    @Nipheris Куратор тега C#
    Добавлять созданием объекта чарта. Привязывать, например, биндингами, как в примере.

    Вы C# и WPF впервые видите?
    Ответ написан
    Комментировать