2009-09-19 5 views
5

몇 가지 다른 데이터 소스를 인덱싱 한 검색 응용 프로그램을 구축 중입니다. 검색 엔진 색인에 대해 쿼리가 수행되면 각 검색 결과는 해당 데이터 소스의 출처를 지정합니다. 각 유형의 검색 결과에 대해 다른 템플릿을 표시하는 데 사용한 팩터 리 패턴을 만들었지 만 검색 엔진에 의해 점점 더 많은 데이터 소스가 인덱싱됨에 따라이 패턴을 관리하기가 더 어려워 질 것입니다 (예 : new 코드 템플리트는 각각의 새 데이터 소스에 대해 작성되어야합니다. C# 팩토리 패턴

내가 유지하기 위해이 검색 응용 프로그램을 쉽게하기 위해 이상 DotNetSlackers.com

factory pattern http://img11.imageshack.us/img11/8382/factoryi.jpg

랜 빌 바넷의 글의 기반으로 내 공장은 다음과 같은 구조를 만들어, 내 생각은 세트를 만드는 것이 었습니다 템플릿을 결정하기 위해 내 공장 패턴이 참조 할 수있는 개별 템플릿 유형을 정의하는 데 사용할 수있는 데이터베이스 테이블이 있습니다. 검색 결과 데이터 소스를 기반으로 구축 할 템플릿 유형을 지정하는 데 사용할 표를 조회해야한다고 생각했습니다. 그런 다음 해당 템플릿 유형을 표시 할 필드를 지정하는 표가 필요합니다. 또한 해당 필드를 렌더링하는 방법 (예 : 하이퍼 링크, 레이블, CssClass 등)을 정의하는 데 사용할 테이블 (또는 템플릿 테이블 내의 추가 열)이 필요합니다.

누구나 이와 같은 패턴의 예가 있습니까? 저에게 알려주세요. 감사합니다. -Robert

답변

4

제안 된 솔루션은 현재 가지고있는 것처럼 데이터 소스를 단순히 코드 템플릿에 연결하는 것보다 유지 관리가 쉽습니다. 사실 템플릿 스키마와 렌더링 정보를 데이터베이스에 전달하여 유연성을 잃어 버릴 것이라는 말을하기까지하면 응용 프로그램을 유지 관리하기가 더 어려워집니다.

예를 들어, (내가 올바르게 이해 해요 경우)의 사용자가 속성이 데이터 소스가 있다고 가정하자 : 그런 다음 검색 결과에서 이러한 데이터 소스의 각 중 하나를 가질 수

Document { Author, DateModified } 
Picture { Size, Caption, Image } 
Song { Artist, Length, AlbumCover } 

. 각 요소는 다르게 렌더링됩니다 (그림은 왼쪽에 고정 된 미리보기 이미지로 렌더링되거나 노래는 앨범 표지 등을 표시 할 수 있음)

제안 된 디자인에서 렌더링을 살펴 보겠습니다. 렌더링을 위해 데이터베이스를 쿼리 한 다음 방출하는 일부 HTML을 조정할 것입니다. 예를 들어 문서의 녹색 배경과 그림의 파란색 배경이 필요하기 때문입니다. 논증을 위해서, 노래에 3 가지 배경색, 그림에 2 가지, 문서에 3 가지 배경색이 정말로 필요하다는 것을 알고 있다고 가정 해 봅시다. 이제 렌더링 값을 적용 할 매개 변수화 된 템플릿을 변경하는 것 외에도 승격되고 푸시 아웃되는 데이터베이스 스키마 변경을 살펴 보았습니다.

문서 결과에 드롭 다운 컨트롤이 필요하고 그림에 몇 개의 버튼이 필요하며 노래에 사운드 플레이어 컨트롤이 필요하다고 결정했다고 가정 해 봅시다. 이제는 데이터 소스별로 각 템플릿이 크게 변경되므로 시작한 곳이 바로 데이터베이스 레이어입니다.

이렇게하면 유연성이 없어져 디자인이 중단됩니다. 데이터 소스마다 다른 템플릿을 정의하십시오. 당신이 잃는 또 다른 일은 템플릿을 소스 컨트롤에서 버전 관리하는 것입니다.

방출 된 뷰에서 공통 요소/컨트롤을 재사용 할 수 있지만 템플릿과 데이터 소스간에 매핑을 유지하고 템플릿을 데이터 소스별로 별도의 파일로 유지하는 방법을 살펴 보겠습니다.CSS 또는 유사한 구성 설정을 통해 렌더링을 유지 관리하십시오. 맵핑을 간단한 XML 파일로 내보내는 것을 고려하여 유지 보수를 쉽게하기. 새 데이터 소스를 배포하려면 매핑을 추가하고 적절한 템플릿과 CSS 파일을 만들어 예상 위치에 놓기 만하면됩니다. 아래의 의견에

응답 :

내가 간단한 스위치 문이 충분해야 의미 :

당신이 출력 논리는 주어진 템플릿을
switch (resultType) 
{ 
    case (ResultType.Song): 
     factory = new SongResultFactory(); 
     template = factory.BuildResult(); 
     break; 
    // ... 

. 당신은 긴 switch 문보다 더 컴팩트 뭔가를하려는 경우에는 다음과 같이 사전에 매핑을 만들 수 있습니다

IDictionary<ResultType, ResultFactory> TemplateMap; 
mapping = new Dictionary<ResultType, ResultFactory>(); 
mapping.Add(ResultType.Song, new SongResultFactory()); 
// ... for all mappings. 

을 그리고, 대신에 switch 문에,이 한 줄 수행 할 수 있습니다

template = TemplateMap[resultType].CreateTemplate(); 

필자의 주된 주장은 어느 시점에서 데이터베이스, 큰 switch 문 또는 초기화해야하는이 IDictionary 인스턴스에서 매핑을 유지해야한다는 것이 었습니다.

당신은 그것을 더 걸릴에서 읽은 간단한 XML 파일의 매핑을 저장할 수 있습니다 :

<TemplateMap> 
    <Mapping ResultType="Song" ResultFactoryType="SongResultFactory" /> 
    <!-- ... --> 
</TemplateMap> 

및 사용 반사 등을. al. IDictionary를 채 웁니다. 여전히 맵핑을 유지하고 있지만, 이제 XML 파일에 배치하는 것이 더 쉬울 수도 있습니다.

+0

설명을 다시 한 번 감사드립니다. 또 다른 눈과 의견을 얻는 것이 좋습니다. 당신의 생각은 저에게 고려해야 할 몇 가지 아이디어를 더했습니다. 다시 한번 감사드립니다. - Robert –