IOC依赖注入简单实例
转自: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依赖注入简单实例的更多相关文章
- IoC 依赖注入容器 Unity
原文:IoC 依赖注入容器 Unity IoC 是什么? 在软件工程领域,“控制反转(Inversion of Control,缩写为IoC)”是一种编程技术,表述在面向对象编程中,可描述为在编译时静 ...
- springboot启动流程(九)ioc依赖注入
所有文章 https://www.cnblogs.com/lay2017/p/11478237.html 正文 在前面的几篇文章中,我们多次提到这么一个转化过程: Bean配置 --> Bean ...
- Spring学习-spring核心机制-IOC依赖注入
转载自:http://www.cnblogs.com/chenssy/archive/2012/11/11/2765266.html 今天复习一下spring两大特性之一:IOC依赖注入,看了一下大佬 ...
- Spring依赖注入 --- 简单使用说明
Spring依赖注入 --- 简单使用说明 本文将对spring依赖注入的使用做简单的说明,enjoy your time! 1.使用Spring提供的依赖注入 对spring依赖注入的实现方法感兴趣 ...
- ASP.NET MVC IOC依赖注入之Autofac系列(二)- WebForm当中应用
上一章主要介绍了Autofac在MVC当中的具体应用,本章将继续简单的介绍下Autofac在普通的WebForm当中的使用. PS:目前本人还不知道WebForm页面的构造函数要如何注入,以下在Web ...
- ASP.NET MVC IOC依赖注入之Autofac系列(一)- MVC当中应用
话不多说,直入主题看我们的解决方案结构: 分别对上面的工程进行简单的说明: 1.TianYa.DotNetShare.Model:为demo的实体层 2.TianYa.DotNetShare.Repo ...
- Spring-DI控制反转和IOC依赖注入
Spring-DI控制反转和IOC依赖注入 DI控制反转实例 IDEAJ自动导入Spring框架 创建UserDao.java接口 public interface UserDao { public ...
- Spring 之 控制反转(IoC), 依赖注入(DI)和面向切面(AOP)
关于依赖注入, 这篇博文写的非常简单易懂. https://github.com/android-cn/blog/tree/master/java/dependency-injection 此外, 博 ...
- Spring.NET 的IOC(依赖注入)
(1) ioc,意思是Inversion of control,(反转控制),控制反转,就是交换控制权的意思.现在一般不使用这个词,一般使用dependency injection(依赖注入).依赖 ...
随机推荐
- Java学习-034-JavaWeb_003 -- JSP page 指令
前文对 JSP 的基础知识进行了初步的讲解,此文主要讲述 JSP page 指令. page 指令用于定义页面的多种属性,例如:脚本语言.编码方式.导入的 Java 包等,page 执行的语法如下: ...
- CDN的原理以及其中的一些技术
本质:DNS解析CNAME时最终会请求到阿里CDN的DNS服务器上,阿里CDN的DNS服务器会判断请求ip的物理区域是哪里,同时根据各CDN节点的压力做全局的负载均衡 返回合适CDN节点的ip. ht ...
- Latency
1)在网络,延迟时间(latency),同义词为延迟,是表示从特定点得到一个数据包(packet)所花的时间.在一些情况下(例如,AT&T),延迟时间用发送出包到回到发送端这个运行一周的时间就 ...
- Docker容器管理
容器是Docker第二个核心概念,简单的的说容器是镜像的一个运行实例,所不同的是,它带有额外的可写文件层. 如果说虚拟机是模拟运行了一整套操作系统(提供运行态环境和其他系统环境)和跑在上面的应用.那么 ...
- python or not python
python or not python 我挺喜欢 python 这种编程语言,它本身的丰富的动态特性让这种语言的表达能力很强,基本上 python 上写的一行代码,可实现 java 上 1.5 到 ...
- 在虚拟机中安装Ubuntu Server 15.04
学Linux,上红联! 红联Linux门户|Linux通用技术|Linux发行版技术|Linux企业应用|Linux实验室|红联Linux论坛 Linux系统教程 Linux入门 Linux管理 Li ...
- python 内存监控模块之memory_profiler
0. memory_profiler是干嘛的 This is a python module for monitoring memory consumption of a process as wel ...
- js DOM 元素ID就是全局变量
有人在twitter上提到了:在Chrome的JavaScript终端中,你只需要输入一个元素的ID,就可以访问到这个元素.@johnjbarton给了解释,这是因为所有的元素ID都是全局变量.本文再 ...
- 解决: libcimtd.lib not found, rpcndr.lib not found
在编译Inside COM这本书的代码的时候. 报这个错. 毕竟1996年的代码... 原因很简单: libcimtd.lib 是 VC6时代的东西(对应着iostream.h)...现在的MS编译器 ...
- PLSQL 的简单命令之二
--1. 查询工资大于12000的员工姓名和工资 --2. 查询员工号为176的员工的姓名和部门号 ' --3. 选择工资不在5000到12000的员工的姓名和工资 --4. 选择雇用时间在1998- ...