转自: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. 【转】shell脚本中echo显示内容带颜色

    shell脚本中echo显示内容带颜色显示,echo显示带颜色,需要使用参数-e.格式如下:   echo -e "\033[41;36m something here \033[0m&qu ...

  2. Selenium2学习-007-WebUI自动化实战实例-005-解决 Firefox 版本不兼容:org.openqa.selenium.WebDriverException: Failed to connect to binary FirefoxBinary

    此文主要讲述 Java 运行 Selenium 脚本时,因 Friefox 浏览器版本与 selenium-server-standalone-x.xx.x.jar 不兼容引起的 org.openqa ...

  3. @SuppressWarnings

    http://www.cnblogs.com/fsjohnhuang/p/4040785.html 一.前言 编码时我们总会发现如下变量未被使用的警告提示: 上述代码编译通过且可以运行,但每行前面的“ ...

  4. Session服务器配置指南与使用经验

    一.摘要 所有Web程序都会使用Session保存数据. 使用独立的Session服务器可以解决负载均衡场景中的Session共享问题.本文介绍.NET平台下建立Session服务器的几种办法, 并介 ...

  5. Sublime用户如何快速高效开发跨平台App

    2015年9月15日,APICloud举办了一周年开源分享会,发布开源插件支持Sublime用户开发跨平台App,APICloud 开源技术负责人周兴海分享了Sublime关于插件方面相关的内容. S ...

  6. 私有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 这 ...

  7. Ionic学习笔记四 一些问题处理

    版权声明:本文为博主原创文章,转载请留链接,非常感谢.   目录(?)[+]   IONIC actionsheet 的cancel menu在android下不显示的bug 在 _action-sh ...

  8. 给JBoss种蛊分析

    JBoss又发现漏洞了,安全圈儿为之一紧. 知道创宇安全研究团队再次本着科普的情怀收集跟JBoss安全相关的材料,为安全行业再出一把力. 这里先给JBoss正下名.通常所说的JBoss,全称是JBos ...

  9. 如何查看自己的linux是32位还是64位

    查看linux是多少位的几位方法:查看linux机器是32位还是64位的方法:方法一:file /sbin/init 或者 file /bin/ls结果如下:/sbin/init: ELF 64-bi ...

  10. scp与rsync限速

    一/scp限速1M #scp -l 1000 文件名 账号@远程机器IP此时的传输速率就是1M/8=100K左右 二/rsync是(限制为 100k Bytes/s): #rsync -auvzP-- ...