转自: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语句查找某个表的触发器

    select   *   from   sysobjects   where   xtype='TR'   and   parent_obj=object_id('表名') 再用sp_helptext ...

  2. Linux中挂载移动硬盘的方法

    - fdisk -l 找出移动硬盘对应的设备 - mkdir 创建挂载点 mkdir /mnt/usb - mount mount -t ntfs-3g /dev/sdb1  /mnt/usb - u ...

  3. LeetCode Dungeon Game

    原题链接在这里:https://leetcode.com/problems/dungeon-game/ 这是一道DP题,保存当前格到右下格所需要的最小体力,m*n的dp数组保存. 更新是Math.mi ...

  4. error LNK2005 int __cdecl 解决方案【转】

    error LNK2005: "int __cdecl isPtInPolygon(class std::vector<struct double2,class std::alloca ...

  5. BlockingQueue的使用

    本例介绍一个特殊的队列:BlockingQueue,如果BlockQueue是空的,从BlockingQueue取东西的操作将会被阻断进入等待状态,直到BlockingQueue进了东西才会被唤醒.同 ...

  6. 最流行的PHP 代码规范

    “PHP是最好的编程语言” ;-) 那么PHPer习惯使用什么样的代码规范呢?sideeffect.kr通过分析GitHub上托管的开源代码,得出了一些有趣的结果,让我们一起来看看吧. 缩进 空格(7 ...

  7. 解决本地tomcat服务器内存不足问题

    2014-6-25 9:47:48 org.apache.coyote.http11.Http11Processor process严重: Error processing requestjava.l ...

  8. Jquery 知识表

  9. Effective C++ 3.资源管理

    //条款13:以对象管理资源 // 1.C++程序中最常使用的资源就是动态分配内存,并且还包括文件描述器,互斥锁,GDI对象.数据库连接.网络socket等.不管哪一种资源,当不再使用的时候必须将其归 ...

  10. !!常见的上穿突破M20方式——突破还是试探的判断

    1和2相似之处在于M5<M20, 最大的区别是M20和M5之间的间距在放大还是缩小,如果是放大,大盘会先试探一下.如果越缩越小,大盘必须选择方向 但是必须注意的是,即使是夹角缩小,选在方向不一定 ...