Да, могут быть. ORM, по типу MS Entity Framework, легко сгенерит Вам запрос с 300+ джойнами.
На счёт кешей и одиночных операций — тоже крайне спорный момент.
Выключать мозг, в любом случае, нельзя.
Если нет возможности использовать Constructor Injection, Вам придёться использовать контейнер как Service Locator внутри этой VM, а это уже попахивает.
Недавно была рецензия на книгу «Dependency Injection in .NET». Вам стоит её почитать.
В Вашем случае можно засетать IPasswordSupplier в VM в методе OnStartup.
Заморочно писать все эти продолжения, ловить ошибки и синхронизировать результаты вычислений.
Есть отличный набор экстеншенов, который используется в ASP.NET Web Stack. С их помощью можно писать вот так:
Можно клонировать IEnumerable<MyType>, если Вам нужно именно это. Как при этом память себя чувствует?
Библиотека позволяет убрать все эти синхронизации, которые ужасают своим видом не подготовленного читателя =)
Писал про TPL Dataflow небольшой пост Использование TPL Dataflow для многопоточной компрессии файлов.
Для клонирования есть BroadcastBlock<T>.
Выглядеть это будет как-то так: Читаем -> BufferBlock<TInput> -> BroadcastBlock<TInput> -> TransformBlock<TInput,TOutput> -> ActionBlock<TOutput>.
Блоков вида -> TransformBlock<TInput,TOutput> -> ActionBlock<TOutput> у Вас будет 100+.
Последний ActionBlock<TOutput> нужен для сохранения результатов (не понял куда Вы их пишете).
На счёт кешей и одиночных операций — тоже крайне спорный момент.
Выключать мозг, в любом случае, нельзя.
В Вашем случае можно засетать
IPasswordSupplierв VM в методе OnStartup.Есть отличный набор экстеншенов, который используется в ASP.NET Web Stack. С их помощью можно писать вот так:
Очень помогает. Статья по теме. Код тут и тут.
BroadcastBlock<TInput>в конструктор принимает клонирующую функциюFunc<T, T>.Можно впихнуть всё, что Вам будет угодно.
IEnumerable<MyType>, если Вам нужно именно это. Как при этом память себя чувствует?Библиотека позволяет убрать все эти синхронизации, которые ужасают своим видом не подготовленного читателя =)
Для клонирования есть
BroadcastBlock<T>.Выглядеть это будет как-то так:
Читаем -> BufferBlock<TInput> -> BroadcastBlock<TInput> -> TransformBlock<TInput,TOutput> -> ActionBlock<TOutput>.Блоков вида
-> TransformBlock<TInput,TOutput> -> ActionBlock<TOutput>у Вас будет 100+.Последний
ActionBlock<TOutput>нужен для сохранения результатов (не понял куда Вы их пишете).Handwritten Mapper: 475 milliseconds
Emit Mapper: 469 milliseconds
Auto Mapper: 205256 milliseconds
В сети много сравнений производительности.
На деле, скорее всего, чуть медленнее, чем руками. Но, явно, удобнее.