Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Много макарон, зато теперь у нас есть многопоточность и отчет о здоровье нашего справочника, в качестве бонуса от архитектуры.
Lazy<Dictionary<string, Country>> для нормальной, человеческой поддержки многопоточности. Оно как раз для этого и предназначено._all и зачем. private static readonly Lazy<Dictionary<string, Country>> _all = new Lazy<Dictionary<string, Country>>(() => {... инициализация ...});
public static IDictionary<string, Country> All { get { return _all.Value; } }
Lazy можно подключить свою фабрику, но это уже выходит за рамки одной строки. Кроме того, какими, кроме статических, параметрами вы хотите инициализировать статическое поле?В доменной логике очень удобно иногда использовать.
Допустим у вас дерево папок. содержащих разные Xml файлы, которые должны обрабатываться в соответствие с определенной логикой.
Тот же Linq2Xml вполне себе АР.
Repository для работы с деревьями? Уже пройденный этап. Добавьте сюда разные механизмы нэйминга и политики и весь репозиторий разваливается. Точнее код становится громоздким и хрупким.
Вообще-то для AR не обязательно иметь доменные свойства в явном виде.
Рекурсивный поиск в LDAP. Репозиторий там весьма неудобен и дата маппером не отделаться.
Плюс тогда у вас распухнет объект отвечающий за маппинг, что опять же будет нехорошо.
То есть если объект содержит только Save, Update, Delete то он уже не АР?
A Query то куда полезет? Сколько разных классов вам необходимо для реализации простейшей функциональности типа UserPrincipal.ChangePassword(..)?
АР это не паттерн представления доменных объектов.
При использовании этого паттерна хранение логики доступа к данным находится в объекте сущности.
Вы инкапсулировали логику поиска в объект. Почему тогда не вынесли в репозиторий?
Чем вас не устраивает наличие логики сохранения в самом объекте?
Несмотря на рекламу Reposiotiry, MS активно использует AR в нэймспэйсе DirectoryServices.
Паттерн не библия, а информация к размышлению
Что вы подразумеваете под доменом
А зачем вам объект типа Query?
А если сам объект будет сохранять себя используя репозиторий?
Я тоже сторонник SoC, но противник анемичных моделей.
ServiceLocator и IoC не исключают друг друга, а способны дополнять.
То есть конфигурация системы — это не доменная логика?
И что вы инкапсулируете? Логику? Данные?
В коде удобно делать
Отвечу Фаулером на Фаулера=) Inversion of Control Containers and the Dependency Injection pattern
То есть если использовать AR для хранения конфигурации, он перестает быть AR? =)
А сам алгоритм обхода дерева где?
В эти места редко кто заглядывает
Но набор задач весьма интересен и специфичен с точки проектирования объектно-ориентированного решения.
Переключая бэкенды через ServiceLocator или IoC
ServiceLocator актуален при разработке фреймворка. Напимер Asp.Net MVC.
Типовые решения применимы в достаточно узком кругу задач.
Здесь есть еще момент. Я не зря упомянул смену пароля. Если у объекта Пользователь выставить пароль наружу, то существует вероятность изменения этого поля в обход определенных правил.
Ваше решение хорошо подойдет для анемичной доменной модели, которая, кстати, то же является антипаттерном
Что именно?
Решение с Repository(+DataMapper)
Как вы будете организовывать сохранение пользователя с измененным паролем, через репозиторий?
Сложный доменный объект != объект со сложной логикой, которую маппинг заменить не в состоянии.
мой опыт говорит, что они существенно ниже, чем при использовании модных технологий
1k online при 20 связанных сервисах на каждого пользователя.
такое мнения у меня сложилось из разговора с коллегой, который использовал hibernate.
Однако синтаксис C# не позволяет этого сделать.
dictionaryRepository.Get<Country>("Russia");
dictionaryRepository.Get<Currency>("USD");
Active Record Pattern