Когда создавать экземпляр уровня уровня приложения?
Я пытаюсь применить гексагональную архитектуру к проекту, в котором будет несколько приложений, имеющих дело с одной и той же моделью домена.
У нас будет, например, веб-сайт mvc, запрашивающий службу приложений, которая затем будет заниматься моделью домена и уровнем доступа к данным. Пока все хорошо.
У меня есть вопрос, когда я должен создать экземпляр класса обслуживания приложения. Должен ли я иметь только один экземпляр любого класса для всех пользователей (синглтон)? Или я должен создать один экземпляр для каждого пользователя, а затем сохранить некоторые пользовательские данные и сохранить их в сеансе пользователя? Или я должен создать новый класс для каждого запроса?
Конечно, любой из этих вариантов возможен, но я хотел бы получить ваши советы передового опыта.
Я предполагаю, что чем больше класс без состояния, тем лучше, но классы без состояния означают, что мне нужно передавать пользовательские данные с каждым вызовом метода, который мне не особенно нравится.
1 ответ
Я обычно держу свои сервисы и классы персистентности в объеме запроса. Это полезно для гарантии того, что я могу отменить транзакцию данных, если что-то пойдет не так, и у меня не останется частичных данных.
Что касается того, почему вам не нужен более длительный объем транзакций, это обычно очень плохой способ повышения производительности и может привести к неожиданному поведению. Особенно, когда речь идет о синглетонах, которые зависят от переходных процессов или классов с ограниченным доступом. Поскольку синглтон создается один раз, его зависимости создаются один раз. Это очень опасно с классами, которые не являются потокобезопасными. Больше на предметах здесь.
Что касается вашей озабоченности по поводу передачи пользовательских данных. Я бы поставил всю информацию, которая вас интересует, за своего рода вспомогательный интерфейс пользовательских данных. Сделайте так, чтобы ваш сервис полагался на это, а не передавал эти данные. Тогда вы можете сделать помощник пользовательских данных, специфичный для клиента, которого вы хотите поддерживать. Вы можете использовать внедрение зависимостей, чтобы настроить приложение mvc для использования конкретной реализации этого помощника пользовательских данных для mvc. И другие клиенты в вашей архитектуре могут делать то же самое.
Я бы написал собственный интерфейс для помощника по пользовательской информации, чтобы именно то, что нужно вашей существующей службе. Пользовательская реализация может основываться на данных сеанса или на том, что может предоставить ваш клиент. Таким образом, реализация может опираться на существующие библиотеки, но преобразует эти данные в общий формат для уровня обслуживания. Таким образом, вы можете поменять местами информацию о своем пользователе, не нарушая остальную часть вашего приложения.