转自: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. Sql Server中通配符

    Sql Server中通配符的使用 通配符_ "_"号表示任意单个字符,该符号只能匹配一个字符."_"可以放在查询条件的任意位置,且只能代表一个字符.一个汉字只 ...

  2. iostart命令

    Linux系统中的 iostat命令可以对系统的磁盘IO和CPU使用情况进行监控.iostat属于sysstat软件包,可以用yum -y install sysstat 直接安装. 1.基本使用:i ...

  3. 私有IP地址范围

    私有IP地址范围 有一部分的地址专门是用于内网的地址,包括: A类中 10.0.0.0/8 B类中 172.16.0.0/12 ~ 172.31.0.0/12 C类中 192.168.0.0/16 这 ...

  4. 欢迎加入iOS开发初学者交流群:180080550

    本人现自学iOS开发,希望有志同道合的兄弟姐妹能一起交流学习, 欢迎加入iOS开发初学者交流群:180080550,期待与您一起进步,一起腾飞!

  5. 第八篇 SQL Server安全数据加密

    本篇文章是SQL Server安全系列的第八篇,详细内容请参考原文. Relational databases are used in an amazing variety of applicatio ...

  6. 通用窗口类 Inventory Pro 2.1.2 Demo1(上)

    插件功能 按照Demo1的实现,使用插件来实现一个装备窗口是很easy的,虽然效果还很原始但是也点到为止了,本篇涉及的功能用加粗标出,具体的功能如下: 1.实现了两个窗口,通过点击键盘I来,打开或者关 ...

  7. 在Swift中整数以及浮点的格式化

    1 整数的格式化 有的时候我们需要将整数输出为类似01,02,001,002这样的格式. 那么在swift中我们可以这样写 let i= let str = String(format:"% ...

  8. Lintcode: Interval Minimum Number

    Given an integer array (index from 0 to n-1, where n is the size of this array), and an query list. ...

  9. Lintcode: Majority Number II

    Given an array of integers, the majority number is the number that occurs more than 1/3 of the size ...

  10. 体验Java的封装性

    package com.cnblogs.java; //体验Java的封装性 /* * 如下的人类年龄赋值-300岁,显然很不合理,这种直接对类的属性赋值,有时候虽然不合理但却会编译通过. * 所以我 ...