文章出處

先說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實現大文件的斷點續傳,敬請收看!


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()