2012-07-19 2 views
0

JSF, Hibernate 및 CDI with Weld를 사용합니다. 내 응용 프로그램은 View (xhtml), Control (Request/Session/Scoped Beans보기), Model (Entities) 및 Business (BO의 Application scope bean으로 표시)로 나뉩니다.세션에서 로그인 한 사용자를 검색하고이를 비즈니스 계층으로 전달하는 방법은 무엇입니까?

Model과 비즈니스 레이어를 가능한 한 많이 뷰와 컨트롤에서 분리하려고합니다. 즉, 모든 xhtml + 컨트롤 bean을 변경하려면 비즈니스 레이어와 엔티티에 영향을 미치지 않고 가능합니다.

내 문제는 다음과 같습니다. 비즈니스 계층에서 로깅 된 사용자 (또는 적어도 자신의 프로필)를 알아야하는 많은 방법이 있습니다. 그 결과로 다시 돌아갈 결과에 영향을 미치기 때문입니다. 제어 층.

예 : 편집 할 사용자 목록을 요청할 때 관리자는 등록 된 모든 사용자와 함께 목록을 수신하고 관리자는 자신의 프로필 "아래"에있는 사용자 만 가진 목록을 받게됩니다.

비즈니스 개체에 세션 Bean (로그인 한 사용자 포함)을 삽입하고 싶지 않습니다. 연결을 야기 할 수 있기 때문입니다. 즉, 언제든지 내 Control/View 레이어를 변경할 수 없기 때문입니다).

요즘에는 기록 된 사용자를 내 BO의 메소드 매개 변수로 전달하지만 나에게 이는 잘못된 느낌을줍니다. Control 레이어는 로그인 한 사용자로 원하는 사람을 그냥 지나칠 수 있다고 생각하고 내 비즈니스 계층은 결코 알지 못합니다.

내 마지막 질문은 : 나는 그것을하고 있어요 방식에 문제가 아무것도

  1. 있습니까? 아니면 내가 너무 많이 생각하고 있니?
  2. 더 좋은 방법이 있나요?

답변

0

나는 도메인 계층의 Bean에 의해 선택 될 수있는 세션 범위에 사용자 ID를 넣는 것이 좋다고 생각합니다. 도메인 계층에서 사용자 ID를 알아야 할 필요가 있다면 도메인 개념이고 거기에 객체가 있어야합니다.

그러나 프리젠 테이션 계층에서 추상화가 누출되는 것이 좋습니다. 도메인 계층의 사용자 ID에 대한 인터페이스를 정의하고 도메인 계층의 코드를 해당 인터페이스와 관련하여 작성한 다음 프레젠테이션 계층에서 해당 구현을 주입하는 것이 좋습니다. 인터페이스는 도메인 계층에 정의되어 있기 때문에 도메인 개념으로 작성하여 표현 개념을 누설하지 않도록 할 수 있습니다.

프리젠 테이션 레이어를 변경하려면 새로운 인터페이스 구현을 작성해야하지만 문제가되지는 않습니다.

취할 수있는 또 다른 방법이 있습니다. Java Authentication and Authorization Service을 사용하여 사용자 ID를 도메인 계층으로 전달할 때 실행 스레드에 바인딩합니다. 그러면 해당 계층의 객체는 표준 JAAS 구조를 사용하여 액세스 할 수 있습니다. 컨테이너가 JACC를 지원하면 JAAS를 통해 이미 사용자 ID를 사용할 수 있습니다. 나는 정말로 모른다.

+0

매우 간단하고 우아한 해결책, 정말 고마워요. 그리고 JAAS에 대한 링크를 확실히 읽을 예정입니다. – RinaldoPJr