10. 1 공통 라이브러리 만들기

검색 서비스와 클라이언트에서 사용할 공통 라이브러리를 만듭시다. 공통 라이브러리 이름은 GenericSearchLib라고 할게요.

공통 라이브러리로 랭커 라이브러리를 직접 사용하는 것은 클라이언트 측에 주요 라이브러리를 배포하는 결과를 초래하므로 여기에서는 리플렉션을 이용하여 래핑한 클래스를 제공하기로 합시다.

여러분께서 아시는 것처럼 .NET 리모팅 서버스로 제공할 공통 라이브러리의 클래스는 MashalByRefObject에서 파생한 형식이여야 합니다. GenericSearch 클래스 이름으로 정의할게요.

public class GenericSearch:MarshalByRefObject
{
}

검색 서비스에서는 랭커 라이브러리를 참조합니다. 그리고 입력 인자로 검색 질의를 받고 결과로 RankedUrl 목록을 반환합니다. 그런데 .NET 리모팅에서는 제네릭 컬렉션을 인자로 사용할 수가 없으므로 ArrayList를 반환하는 것으로 할게요.

public ArrayList Request(string query)

메서드에서는 제일 먼저 랭커 라이브러리를 로딩하고 랭커 라이브러의 Ranker 형식을 얻어옵니다.

Assembly asm = Assembly.Load("RankerLib");
Type type = asm.GetType("RankerLib.Ranker");

질의에 사용할 Request 메서드의 리플렉션 정보인 MethodInfo를 얻어옵니다.

MethodInfo mi = type.GetMethod("Request");

질의에 사용할 인자를 object 배열로 만듭니다.

object[] objs = new object[1]{query};

Request 메서드의 리플렉션 정보 개체를 이용하여 실행합니다.

List<RankedUrl> rlist = mi.Invoke(null, objs) as List<RankedUrl>;

얻어온 질의 결과로 ArrayList 개체를 생성하여 이를 반환합니다.

ArrayList ar = new ArrayList(rlist);
return ar;

▷ GenericSearch.cs

using System;
using System.Collections.Generic;
using WSE_Core;
using System.Reflection;
using System.Collections; 
namespace GenericSearchLib
{
    /// <summary>
    ///검색 서비스를 제공하는 Generic 클래스
    /// </summary>
    public class GenericSearch:MarshalByRefObject
    {
        /// <summary>
        /// 검색 요청 메서드
        /// </summary>
        /// <param name="query">검색 질의</param>
        /// <returns>검색 결과(순위화 한 페이지 목록)</returns>
        public ArrayList Request(string query)
        {
            Assembly asm = Assembly.Load("RankerLib");
            Type type = asm.GetType("RankerLib.Ranker"); 
            MethodInfo mi = type.GetMethod("Request");
            object[] objs = new object[1]{query};
            List<RankedUrl> rlist = mi.Invoke(null, objs) as List<RankedUrl>;
            ArrayList ar = new ArrayList(rlist);
            return ar;
        }
    }
}