Совместное использование LDAP-соединения между классами - лучшие практики?
Что мне нужно сделать, это подключиться к LDAP, а затем передать это соединение нескольким классам, которые выполняют различные этапы обработки.
Проблема, с которой я сталкиваюсь, заключается в том, должен ли я передавать соединение с этими классами через конструктор или каждый класс должен управлять своим собственным соединением.
Проблема, которую я вижу с первым подходом, заключается в том, что вызывающий может не знать, что он сам отвечает за закрытие потока. Второй подход также не кажется подходящим, потому что открытие / закрытие / повторное открытие соединения также не имеет смысла.
Есть идеи по этому поводу?
2 ответа
Я не знаю, почему у вас есть несколько классов, имеющих дело с LDAP. Возможно, вам следует рассмотреть возможность объединения этих разрозненных операций в один класс, который несет всю ответственность за операции LDAP.
Если это невозможно, ваши инстинкты верны. Класс, который открывает соединение, должен закрыть его в блоке finally. Это должен быть класс обслуживания POJO на основе интерфейса, который знает о единице работы для этого варианта использования. Не должно быть никаких сомнений в том, где лежит ответственность. Если у вас нет такой услуги, создайте ее.
Если операции не являются частью одной единицы работы, то ими должны управлять отдельные службы. Комментарии из предыдущего абзаца остаются в силе.
Вы объединяете свои соединения LDAP? Я надеюсь, что это так.
Я бы рекомендовал взглянуть на модуль Spring LDAP, особенно если вы уже являетесь пользователем Spring. Это облегчает работу с ресурсами LDAP, так же, как и с JDBC.
Плохо практиковать создание служебного класса или любого другого класса, который предоставляет широкий спектр услуг. Классы должны предоставлять один сервис или группу строго контролируемых сервисов, иначе вы также можете вернуться к обычным блокам мусора FORTRAN. Чтобы разделить соединение LDAP между классами, инкапсулируйте соединение (это также поможет скрыть детали API). Затем защитите методы, если необходимо, путем аутентификации с использованием учетных записей на сервере каталогов. Например, close()
Метод должен требоваться для аутентификации в учетной записи, которая имеет близкие привилегии, или является членом закрытой группы, или любого другого authn / authz, который вы предпочитаете. Вы должны использовать UnboundID LDAP SDK для этого типа работы. Смотрите также " LDAP: Практика программирования".