在EasyNet.Solr中,有两个接口最重要,一个是编解码器接口ICodec,一个是Solr输出结果解析器接口ISolrResponseParser<ST, DT>。
ICode定义如下;
1 /// <summary>
2 /// 编解码器
3 /// </summary>
4 public interface ICodec
5 {
6 /// <summary>
7 /// 对对象进行编码,并输出到流
8 /// </summary>
9 /// <param name="obj">要进行编码的对象</param>
10 /// <param name="stream">输出流</param>
11 void Marshal(object obj, Stream stream);
12
13 /// <summary>
14 /// 对流进行解码
15 /// </summary>
16 /// <param name="stream">要解码的流</param>
17 /// <returns>解码后的对象</returns>
18 object Unmarshal(Stream stream);
19 }
2 /// 编解码器
3 /// </summary>
4 public interface ICodec
5 {
6 /// <summary>
7 /// 对对象进行编码,并输出到流
8 /// </summary>
9 /// <param name="obj">要进行编码的对象</param>
10 /// <param name="stream">输出流</param>
11 void Marshal(object obj, Stream stream);
12
13 /// <summary>
14 /// 对流进行解码
15 /// </summary>
16 /// <param name="stream">要解码的流</param>
17 /// <returns>解码后的对象</returns>
18 object Unmarshal(Stream stream);
19 }
EasyNet.Solr内置了两个编解码器实现:JavaBinCodec,TextCodec。JavabinCodec对应Solr中基于javabin协议,TextCodec对应Solr中的xml、json等基于文本的协议。相应定义了BinaryCodecFactory,用于创建JavabinCodec,TextCodecFactory用于创建TextCodec。在SolrConnection中有个CodecFactory的属性,这是
ICodecFactory很简单的一个接口,定义如下:
1 /// <summary>
2 /// 编解码工厂
3 /// </summary>
4 public interface ICodecFactory
5 {
6 /// <summary>
7 /// 创建编解码器
8 /// </summary>
9 /// <returns></returns>
10 ICodec CreateCodec();
11 }
2 /// 编解码工厂
3 /// </summary>
4 public interface ICodecFactory
5 {
6 /// <summary>
7 /// 创建编解码器
8 /// </summary>
9 /// <returns></returns>
10 ICodec CreateCodec();
11 }
为了更好的分离及扩展,我没有把SolrConnection设计的很复杂,它就是很简单的用ICodecFactory创建编解码器ICodec,然后把javabin协议对应的NamedList,或者基于xml、json等文本协议对应的字符串写入流,用于更新索引等操作,把输出流转换为javabin协议对应的NamedList,或者字符串文本,用于Solr返回结果处理。
ISolrResponseParser<ST, DT>定义如下;
1 /// <summary>
2 /// Solr返回解析器泛型接口
3 /// </summary>
4 /// <typeparam name="ST">ST类型返回数据</typeparam>
5 /// <typeparam name="DT">DT类型要解析为的数据</typeparam>
6 public interface ISolrResponseParser<ST, DT>
7 {
8 DT Parser(ST result);
9 }
2 /// Solr返回解析器泛型接口
3 /// </summary>
4 /// <typeparam name="ST">ST类型返回数据</typeparam>
5 /// <typeparam name="DT">DT类型要解析为的数据</typeparam>
6 public interface ISolrResponseParser<ST, DT>
7 {
8 DT Parser(ST result);
9 }