[AOP] 使用 Sophus 為 Windows 控制項動態增加輸入驗證

來源:互聯網
上載者:User

開發一個Windows應用程式,肯定少不了控制項的輸入驗證,而增加輸入驗證的方法不計其數,這裡介紹一種使用Sophus的攔截功能來為你的  TextBox 控制項很乾淨地增加輸入驗證的方法。“很乾淨”這裡指的意思是可以透明的增加和刪除輸入驗證而不用考慮任何使用者邏輯代碼。

現在我們有一個 TextBox 名為 textBox1 ,還有一個Button 叫 button1
這個button1有一個click事件,代碼如下

        private void button1_Click(object sender, System.EventArgs e)
        {
            MessageBox.Show("The number is \"" + textBox1.Text + "\"");
        }

如果我們要給 textBox1 控制項增加一個輸入驗證,而不改動 button1 的代碼要怎麼辦?

我們可以看一下 textBox1.Text這個屬性,這個是一個virtual的屬性,就意味著可以被攔截,好了,大致的解決辦法出來了,我們是用 Sophus提供的 IInterceptor介面實現一個攔截器介面代碼如下

    public class NumberValidationInterceptor : IInterceptor
    {
        public object Intercept(IInvocation invocation, params object[] args)
        {
            string retString = invocation.Proceed(args) as string;

            if(Regex.IsMatch(retString, @"^[+-]?\d*[.]?\d*$"))
            {
                return retString;
            }
            else
            {
                MessageBox.Show("Please input a number.","Validation Failure",MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return "0";
            }
        }
    }

這個攔截器具體要攔截什麼,接下來我們定義一個Contract,裡面就包含了攔截的具體對象和方法等詳細資料,代碼如下:            EmitProxyContract contract = new EmitProxyContract();
            contract.Target(typeof(TextBox));
            contract.Intercept(typeof(NumberValidationInterceptor), "get_Text");

然後呢就是建立這個動態代理的的類型            EmitProxy proxy = (new EmitProxyFactory()).GetProxy(contract);
            proxy.Independent = true;

 這裡我們使用了 Independent = true 的意思就是可以將這個動態代理的配置與其他使用同樣contract的動態代理配置獨立出來,從而可以使用Sophus的一些進階功能,如下面這種textBox1 = proxy.Wrap(this.textBox1) as TextBox;

這句話就是使用由Sophus封裝的textBox1類型動態替換掉原有的textBox1,而 textBox1的instance並沒有變,大家可以看表單上的控制項就可以知道,但是上邊的button1在click的時候就會被動態hook住了,這就是Sophus的神奇之處。

看,當textBox1中輸入的不是數字時,動態攔截器就生效了。

從這裡下載Sophus免費版本: http://research.grapecity.com.cn/cs/files/7/sophus/default.aspx
Sophus論壇: http://research.grapecity.com.cn/cs/forums/14/ShowForum.aspx

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.