2013-02-20 2 views
0
나는 다음과 같은 상황이

:에NHibernate에 데이터 필터링 모범 사례

사용자 로그, 모든 제품의 개요를 열어 만 조건이 추가 된 제품의 목록을 볼 수 있습니다,이 조건은 변수입니다. 예 : WHERE category in ('catA', 'CatB')

관리자가 로그인하면 모든 제품에 대한 개요가 열리고 필터가 적용되지 않은 모든 제품이 표시됩니다.

가능한 한 동적으로 작성해야합니다. 내 데이터 액세스 클래스는 대부분 제네릭을 사용합니다.

나는 filters을 보았지만 나의 조건은 매우 가변적이어서 확장 성이 충분하지 않습니다.

답변

2

우리는 NH 필터를 비슷한 용도로 사용하며 정상적으로 작동합니다. 필터를 적용 할 필요가없는 경우 필터의 값을 설정하지 않아도됩니다. 우리는 더 기본적인 것들, 시간의 거의 100 % 적용되는 필터, fx 삭제 된 객체 필터, 클라이언트 데이터 분리 등을 위해이 필터들을 사용합니다. 당신이 찾고있는 확장 성 측면을 확신하지 못합니까?

더 높은 수준의 복잡한 필터링의 경우 저장소 루트를 조작하는 사용자 지정 클래스를 사용합니다. 다음과 같은 뭔가 :

당신이 당신의 NH 사용과 통합 된 IoC 컨테이너는이 같은 쉽게 일반화하고 스택에 연결 할 수있는 경우
public IQueryOver<TIn, TOut> Apply(IQueryOver<TIn, TOut> query) 
{ 
     return query.Where(x => ...); 
} 

. 우리는 어디에서 간단한 절을하는 이러한 저장소 조작자를 가지고 있으며 복잡한 다른 부분을 생성하는 다른 부분은 도메인 논리를 참조하는 항목과 다른 항목은 두 번째 테이블을 조인하고 다른 항목을 필터링합니다.

+0

그래, 내가 그런 식으로 뭔가를 할 수있는 일종의 사용자 (웹 환경)의 세션에 필터를 저장할 것 같아요. 대부분의 필터는 조인이 아닌 테이블 열 자체에 있습니다. –

+0

잘 작동합니다. 우리의 환경은 ASP.NET 사이트이기도합니다. 우리는 Castle.Windsor와 함께 커스텀'DefaultTypedFactoryComponentSelector' 팩토리를 사용합니다. 필터 속성 클래스와 함께, 문자열 이름만을 사용하여 컨테이너로부터 필터를 가져올 수 있습니다 (하드 코드 된 필터를 포함하는 정적 클래스 이 메소드는 Apply를 호출함으로써 설정 될 수있다. 선택적으로 인터페이스의 void SetValue (T value) 메소드를 통해 컨텍스트 데이터를 설정한다. – Svend

0

모든 범주를 범주 목록에 저장하고이 목록을 쿼리에 전달할 수 있습니다. 리스트가 null는 아니고, 요소를 포함하는 경우 다음과 같은 작업을 할 수 있습니다

List<string> allowedCategoriesList = new List<string>(); 
allowedCategoriesList.Add(...); 
... 
.WhereRestrictionOn(x => x.category).IsIn(allowedCategoriesList) 

그것은 당신이 어떤 필터를 (그래서, 당신은 필터링없이 모든 항목을보고 싶어)이없는 경우이 항목을 건너 뛸 만 중요합니다, 그렇지 않으면 하나의 결과가 표시되지 않습니다.