先說AOP
說到注入,大家就會想起來IoC和AOP,確實如些,這一講中,我們通過unity來實現對thrift插件的動態注入,事實上,這個功能在以后的項目中經常要用到,比如,你將一些功能分發到指定服務器,而這些服務器的功能是可以動態調整的,每臺服務器的插件功能都不相同,這時,如果你有新的插件開發好后,如果不使用AOP的思想,那簡直就是災難!試想,有100個客戶端的程序,你將會把新的程序和插件一個個的重新安裝到100個客戶端電腦上,這是無可厚非的,但如果有了AOP思想,那么,客戶端的程序可以實現根據配置文件動態去加載BIN下的DLL的功能,這是吸引人的,呵呵。
再說Thrift容器
Thrift的動態插件需要有一個統一的入口,即所有thrift插件都裝到這個入口容器中,事實上,這就是AOP方法攔截的思想,將這些插件的執行控制在某個方法的執行之前或者之后,這是一種巧妙的設計,它解決了不斷生產出來的插件的裝載問題。
Thrift容器設計,核心代碼
Thrift容器有著自己的特色,它需要有一個端口,一個傳輸協議,和一批動態被加載的Handle,即處理程序(或者叫“插件),我們來看一個代碼:
/// <summary> /// Thrift容器規范 /// </summary> public interface IThriftHandle { /// <summary> /// 處理程序 /// </summary> void Handle(); }
/// <summary> /// 為thrift提供的插件容器 /// </summary> public class ThriftHandle : IThriftHandle { /// <summary> /// 插件處理器的集合,每當一個插件被激活, /// 在攔截Hanle()之前,都會前自己的Processor /// 添加到MultiplexedProcessor中 /// </summary> public readonly static TMultiplexedProcessor MultiplexedProcessor = new TMultiplexedProcessor(); public void Handle() { //遠程登陸調用 new Thread(() => { var serverTransport = new TServerSocket(9800); var server1 = new TThreadedServer(MultiplexedProcessor, serverTransport); Console.WriteLine("開啟擴展服務..."); server1.Serve(); }).Start(); }
OK,我們看到了容器代碼之后,對于具體的thrift插件,只要調用MultiplexedProcessor屬性的register方法即可完成插件的注冊了,而這部分的代碼都是在DLL項目里完成的,即一個插件,一個DLL,或者一組類型的插件,一個DLL,這也符合面向對象的原則,即每個插件的職責都是單一的。
看個thrift插件的例子,一個遠程命令調用的例子:
/// <summary> /// 遠程命令攔截器 /// </summary> public class RemoteCommandBehavior : Project.InterceptionBehaviors.InterceptionBase { public override IMethodReturn Invoke( IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext) { Console.WriteLine("遠程命令調用開始..."); //注冊thrift插件到thrift容器 ThriftHandle.MultiplexedProcessor.RegisterProcessor("RemoteCommandHandler", new RemoteCommandService.Processor(new RemoteCommandHandler())); return getNext().Invoke(input, getNext); } }
RemoteCommandBehavior所對應的Handle處理程序我就省略了,呵呵。
看一下AOP Thrift插件的圖示
下一講,我們將分析一下,如何通過thrift實現大文件的斷點續傳,敬請收看!
文章列表