Запрос LINQ - для Объяснения было нужно того, почему эти примеры отличаются

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

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

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

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

8
задан Andrew Rollings 23 December 2008 в 19:01
поделиться

2 ответа

То, что происходит с первым примером, - то, что значение гласного получено в локальное (к объему для цикла) переменная.

Где-пункт для запроса будет затем использовать ту полученную переменную. Операторы Where как это используют анонимный метод метода/лямбды, который может получить локальные переменные. Что происходит, затем то, что это получает текущее значение переменной.

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

Таким образом в первом примере, Вы получаете этот тип запроса:

IEnumerable<char> query2 = "Not what you might expect";
Char t1 = 'a'; query2 = query2.Where(c => c != t1);
Char t2 = 'e'; query2 = query2.Where(c => c != t2);
Char t3 = 'i'; query2 = query2.Where(c => c != t3);
Char t4 = 'o'; query2 = query2.Where(c => c != t4);
Char t5 = 'u'; query2 = query2.Where(c => c != t5);

Во втором примере Вы получаете это:

IEnumerable<char> query2 = "Not what you might expect";
Char vowel = 'a'; query2 = query2.Where(c => c != vowel);
vowel = 'e'; query2 = query2.Where(c => c != vowel);
vowel = 'i'; query2 = query2.Where(c => c != vowel);
vowel = 'o'; query2 = query2.Where(c => c != vowel);
vowel = 'u'; query2 = query2.Where(c => c != vowel);

К тому времени, когда Вы выполняете этот второй пример, значение vowel будет 'u', поэтому только Вы будут разделены. У Вас есть, однако, 5 циклов по той же строке для разделения 'u', но только первый, конечно, сделает это.

Это получение переменных является одной из вещей, за которые все мы спотыкаемся при использовании анонимных методов/лямбд, и можно читать больше об этом здесь: C# Подробно: Красота Закрытий.

Если Вы просматриваете вниз что страница к тексту при Сравнении стратегий получения: сложность по сравнению с питанием, Вы найдете некоторые примеры этого поведения.

10
ответ дан 5 December 2019 в 15:27
поделиться

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

В случае без временной переменной существует только ссылка на переменную цикла.

Так пять ссылок по сравнению с одной ссылкой. Вот почему это приводит к результатам как показано.

В первом случае, после того как это оценило цикл полностью, запрос использовал эти пять ссылок на временные переменные, следовательно снимая a, e, я, o и u соответственно.

Во втором случае это делает то же самое... только все пять ссылок к той же переменной, которая очевидно только содержит одно значение.

Мораль истории: Думайте, что "ссылка" не "оценивает".

Так, это имеет смысл кому-либо еще теперь?

1
ответ дан 5 December 2019 в 15:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: