转自:http://hi.baidu.com/xyz136299110/item/a32be4269e9d0c55c38d59e6

相信大家看过相当多的IOC依赖注入的例子。

但大家在没有明白原理的情况下,都或多或少有些疑问或者弄不明白程序逻辑。

其实说白了,所以的起点都依赖于XML文件。

下面给出一个非常简单的实例,(例子是说对数字,1-100,偶数的三项验证)

我们经常有有其中的一项或多项验证。那么我们该如何处理呢?抑或我们加入新的验证的时候如何才能最小的修改代码及程序逻辑呢?

怎么样才能使新的验证逻辑(A编写验证逻辑,B调用验证方法,那么当新的验证逻辑存在时,如何才能最小耦合呢??)

这就用到反射依赖注入了滴。

OK,贴上实例。

一、验证逻辑

1.数字验证

public class NumCheck:ICheck
    {

public bool IsCheckRight(int Number)
        {
            Regex regex = new Regex("^[0-9]*$");
            return regex.IsMatch(Number.ToString().Trim());
        }

}

2.偶数验证

public  class OSCheck:ICheck
    {

public bool IsCheckRight(int Number)
        {
            bool flag=false;
            int number = 0;
            if (int.TryParse(Number.ToString(), out number))
            {
                if (number % 2 == 0)
                {
                    flag = true;
                }
            }
            return flag;
        }}

3.范围验证

public class RangeCheck:ICheck
    {

public bool IsCheckRight(int Number)
        {
            bool flag = false;
            int number = 0;
            if (int.TryParse(Number.ToString(), out number))
            {
                if (number >= 1 && number <= 100)
                {
                    flag = true;
                }
            }
            return flag;
        }    }

二。接口定义

public  interface ICheck
    {
        /// 是否验证成功
        bool IsCheckRight(int Number);
    }

三.工厂反射

public static class AFactory
    {

private static Hashtable bllList = null;
        private static Object lockobj = new Object();

public static ICheck GetBLLInterface(string assemblyName, string bllClassName)
        {
            ICheck ret = null;
            try
            {
                if (bllList == null)
                {
                    bllList = new Hashtable();
                }
                if (bllList[assemblyName] == null)
                {

lock (lockobj)
                    {
                        Assembly assembly = Assembly.Load(assemblyName);
                        ret = (ICheck)assembly.CreateInstance(bllClassName);
                        bllList.Add(assemblyName, assembly);
                    }
                }
                else
                {
                    Assembly assembly = (Assembly)bllList[assemblyName];
                    ret = (ICheck)assembly.CreateInstance(bllClassName);
                }
            }
            catch (Exception ex)
            {
            }
            return ret;
        }
    }

四.注入点(XML文件此处)

<?xml version="1.0" encoding="utf-8" ?>
<DataKeys>
<add key="NumCheck" value="Com.Area.DAL.NumCheck"></add>
<add key="OSCheck" value="Com.Area.DAL.OSCheck"></add>
<add key="RangeCheck" value="Com.Area.DAL.RangeCheck"></add>
</DataKeys>

五.统一的验证逻辑类

public class BaseCheck
    {
        private static readonly string Path = "Com.Area.DAL";

public static ICheck GetIcheck(string CheckKey)
        {
            string ClassName = string.Empty;
            DataSet ds = new DataSet();
            if (!string.IsNullOrEmpty(CheckKey))
            {
                ds.ReadXml("../../Check.xml");
                ClassName = ds.Tables[0].Rows[Convert.ToInt32(CheckKey)-1][1].ToString().Trim();
                return AFactory.GetBLLInterface(Path, ClassName) as ICheck;
            }
            else
                return null;
        }

public static bool Check(int Number,ref string Msg)
        {
            bool flag = true;
            string ClassName = string.Empty;
            DataSet ds = new DataSet();
            ds.ReadXml("../../Check.xml");
            for (var i = 0; i < ds.Tables[0].Rows.Count; i++)
            {
                ClassName = ds.Tables[0].Rows[i][1].ToString().Trim();
               ICheck check = AFactory.GetBLLInterface(Path, ClassName) as ICheck;
                if (!check.IsCheckRight(Number))
               {
                    flag = false;
                    Msg = "验证失败";
                    break;
                }
            }
            return flag;
        }
    }

六.操作界面

代码如下:

private void button1_Click(object sender, EventArgs e)
        {
            btnClick(button1);
        }

private void button4_Click(object sender, EventArgs e)
        {
            if (this.textBox1.Text == "" || this.textBox1.Text.Length <= 0)
            {
                MessageBox.Show("ERROR");
            }
            else
            {
                string Mesg = string.Empty;
                if (!BaseCheck.Check(Convert.ToInt32(this.textBox1.Text), ref Mesg))
               {
                    MessageBox.Show(Mesg);
                }
                else { MessageBox.Show("Right"); }

}
        }

private void button3_Click(object sender, EventArgs e)
        {
            btnClick(button3);
        }

private void button2_Click(object sender, EventArgs e)
        {
            btnClick(button2);
        }

private void btnClick(Button btn)
        {
            if (this.textBox1.Text == "" || this.textBox1.Text.Length <= 0)
            {
                MessageBox.Show("ERROR");
            }
            else
            {
                string Tag = btn.Tag.ToString().Trim();
               ICheck check = BaseCheck.GetIcheck(Tag);
                if (check.IsCheckRight(Convert.ToInt32(this.textBox1.Text)))
               {
                    MessageBox.Show("验证成功");
                }
                else { MessageBox.Show("Error!"); }
            }
        }

IOC依赖注入简单实例的更多相关文章

  1. IoC 依赖注入容器 Unity

    原文:IoC 依赖注入容器 Unity IoC 是什么? 在软件工程领域,“控制反转(Inversion of Control,缩写为IoC)”是一种编程技术,表述在面向对象编程中,可描述为在编译时静 ...

  2. springboot启动流程(九)ioc依赖注入

    所有文章 https://www.cnblogs.com/lay2017/p/11478237.html 正文 在前面的几篇文章中,我们多次提到这么一个转化过程: Bean配置 --> Bean ...

  3. Spring学习-spring核心机制-IOC依赖注入

    转载自:http://www.cnblogs.com/chenssy/archive/2012/11/11/2765266.html 今天复习一下spring两大特性之一:IOC依赖注入,看了一下大佬 ...

  4. Spring依赖注入 --- 简单使用说明

    Spring依赖注入 --- 简单使用说明 本文将对spring依赖注入的使用做简单的说明,enjoy your time! 1.使用Spring提供的依赖注入 对spring依赖注入的实现方法感兴趣 ...

  5. ASP.NET MVC IOC依赖注入之Autofac系列(二)- WebForm当中应用

    上一章主要介绍了Autofac在MVC当中的具体应用,本章将继续简单的介绍下Autofac在普通的WebForm当中的使用. PS:目前本人还不知道WebForm页面的构造函数要如何注入,以下在Web ...

  6. ASP.NET MVC IOC依赖注入之Autofac系列(一)- MVC当中应用

    话不多说,直入主题看我们的解决方案结构: 分别对上面的工程进行简单的说明: 1.TianYa.DotNetShare.Model:为demo的实体层 2.TianYa.DotNetShare.Repo ...

  7. Spring-DI控制反转和IOC依赖注入

    Spring-DI控制反转和IOC依赖注入 DI控制反转实例 IDEAJ自动导入Spring框架 创建UserDao.java接口 public interface UserDao { public ...

  8. Spring 之 控制反转(IoC), 依赖注入(DI)和面向切面(AOP)

    关于依赖注入, 这篇博文写的非常简单易懂. https://github.com/android-cn/blog/tree/master/java/dependency-injection 此外, 博 ...

  9. Spring.NET 的IOC(依赖注入)

    (1)  ioc,意思是Inversion of control,(反转控制),控制反转,就是交换控制权的意思.现在一般不使用这个词,一般使用dependency injection(依赖注入).依赖 ...

随机推荐

  1. Selenium2学习-034-WebUI自动化实战实例-032-获取页面 body 大小

    获取 body 元素大小的方法,非常简单,直接上码,敬请参阅! /** * Get body size * * @author Aaron.ffp * @version V1.0.0: autoSel ...

  2. webstorm注册

    选择“license server” 输入:http://114.215.133.70:41017(适用ws2016.2.2) 2.3选择activation code注册 43B4A73YYJ-ey ...

  3. PDO防注入原理分析以及使用PDO的注意事项

    我们都知道,只要合理正确使用PDO,可以基本上防止SQL注入的产生,本文主要回答以下两个问题: 为什么要使用PDO而不是mysql_connect? 为何PDO能防注入? 使用PDO防注入的时候应该特 ...

  4. ucenter 通信成功后 apps.php无误后 该做的事

    比如你的系统有个登陆功能,在本系统登陆之前要先执行如下代码,先把apps.php里的所有站点先登陆一遍 <meta charset="utf8"> <?php i ...

  5. [BS] 小知识点总结-03

    1.Autolayout中“constrain to margins” Autolayout中的页面边距的问题ios8以后的UIView增加了layoutMargins属性,在Storyboard/I ...

  6. 11月16日《奥威Power-BI基于SQL的存储过程及自定义SQL脚本制作报表》腾讯课堂开课啦

           上周的课程<奥威Power-BI vs微软Power BI>带同学们全面认识了两个Power-BI的使用情况,同学们已经迫不及待想知道这周的学习内容了吧!这周的课程关键词—— ...

  7. 随机数产生random

    随机数产生推荐用random(),在产生随机数前要添加种子srandom((unsigned int)time(NULL)). SYNOPSIS #include <stdlib.h> l ...

  8. SQLdiag-初识

    SQLdiag是一个命令行实用工具,默认情况下,在C:\Program Files\Microsoft SQL Server\100\Tools\Binn目录下可用.首先我们打开SQLdiag.exe ...

  9. [ROS]3 Linux编程练习

    一起做RGB-SLAM(2)实验 第二讲 从图像到点云 http://www.cnblogs.com/gaoxiang12/p/4652478.html exbot@ubuntu:~$ cd Code ...

  10. Vue.2.0.5-过渡效果

    概述 Vue 在插入.更新或者移除 DOM 时,提供多种不同方式的应用过渡效果.包括以下工具: 在 CSS 过渡和动画中自动应用 class 可以配合使用第三方 CSS 动画库,如 Animate.c ...