2009-05-12 2 views
2

나는 검색 기준을위한 텍스트 상자와 검색 버튼이있는 WinForm 비즈니스 응용 프로그램 화면을 계속 개발하고 있습니다. Linq를 사용하는 표현식에 매핑 된 다음 Linq2Sql 계층으로 전달됩니다.Linq 검색 화면에 대한 쿼리와 입력란 사이에 쉬운 바인딩 맵을 만들기 위해 어떤 디자인 패턴을 사용해야합니까?

나는, "startswith", "완전 일치"등을 "포함"와 같은 다른 옵션을 사용하여 기본 쿼리에이 텍스트 상자를 "결합"하는 쉬운 방법을 만들고 싶습니다 ... 내가 '무엇

SearchBinder<Customer> searchBinder = new SearchBinder<Customer>(); 
searchBinder.Bind(txtFirstName, a=>a.FirstName, SearchBinderOptions.StarsWith); 
searchBinder.Bind(txtLastName, a=>a.LastName, SearchBinderOptions.StarsWith); 
searchBinder.Bind(txtTelephone, a=>a.Phone, SearchBinderOptions.Equals); 
searchBinder.SetAction(btnSearch, MyMethodThatHandlesTheExpressionTreeAndFillsTheResults); 

그런 다음 클릭 검색이 자동으로 텍스트 상자가 빈되지 않은 식 트리 을 생성하고 검색을합니다 : m의 상상은 다음과 같이 (SearchBinderT 상상입니다주의)이다. 그러나 그것은 내 머리 속의 하나의 패턴뿐입니다 - 더 많은 것이 있습니다. 저는 주로 빠른 애플리케이션 개발에 중점을 둡니다.

  • 어떤 디자인 패턴을 사용 하시겠습니까 (아니면 내가 잘 생각하고 있습니까?).
  • 당신은 어떻게
+0

나는 그것이 꽤 멋진 컨셉이라고 말한다. –

답변

0

가 지연 실행 및 람다의 촬영 상태가이 문제를 해결하지 않을까요 (이상/이하와 날짜/번호) 다른 데이터 유형을 처리 할 것인가? searchQuery 이후

Predicate<Customer> searchQuery = c => { 
    c.FirstName.StartsWith(txtFirstName.Text) 
    && c.LastName.StartsWith(txtLastName.Text) 
    && c.Phone == txtTelephone.Text; 
} 

void btnSearch_Click(object sender, EventArgs e) { 
    return IEnumerable<Customer>.Where(searchQuery); 
} 

이 버튼을 클릭 할 때까지 실행되지 않습니다, 구성 요소 "빌더"로 비교 밖으로 추상적 할 필요가 없습니다. 텍스트 상자에 액세스하는 데있어 전체 멀티 스레드 문제가 있지만 Expression<T>을 대신 사용하고 Control.Invoke으로 분해하고 다시 작성할 수 있습니다. 아니면, 먼저 Invoke으로 작성하십시오. 또는 UI 스레드로 다시 전송하여 실행하십시오.

하지만 실제로 디자인에 참여하고 싶다면 비교 연산자 대신 Expression<T>을 사용하는 것이 좋습니다. 유연성이 뛰어나고 좋은 일을 덜어줍니다.

디자인 패턴은 내가 알고있는 가장 가까운 것이 Query Object 일 것입니다. [N] Hibernate는 Criteria 형태입니다. UI 요소에 바인딩하지 않고 동적 쿼리를 작성하는 방법에 대해 다룹니다 (요점은 보이지 않습니다). 귀하의 예에서는 귀하의 쿼리가 하드 코딩되어 있으므로 어떤 이점이 있는지 확신 할 수 없습니다.

+0

빌더 구성 요소에는 텍스트 상자가 채워 졌는지 여부에 따라 술어를 작성하는 논리가 있습니다. 빈 텍스트 상자는 쿼리에서 제외해야합니다. 당신은 그것을 고려하지 않습니다. – TheSoftwareJedi

+0

오케이 - 컨트롤에 데이터 바인딩 된 쿼리 개체를 원하는 것처럼 들립니다. 값이 비어 있으면, 조회에서 제외됩니다 (이는 일] 조회 오브젝트 패턴 임). –

관련 문제