IOC AOP 不是什么技术而是一种设计模式 学习 IOC AOP 其实是在学习一种思想。
1.IOC
IOC其实是 将对象的创建和获取提取到外部。由外部IOC容器提供需要的组件。
看下面代码:
public class Girl { //外部包办直接传入boy类 public void kiss3(Boy boy) { Console.WriteLine("girl kiss boy"); boy.kiss(); } } public class Boy { public void kiss() { Console.WriteLine("boy kiss girl"); } }
当我在Girl类中要使用Boy类的时候一般做法是在 Girl中实例化Boy类在进行调用如下代码:
public class Girl { //1. 内部实例化boy类 public void kiss1() { Boy boy = new Boy(); boy.kiss(); } }
然而在IOC 设计模式中 则将实例化操作放到了 IOC容器中,在这里我们将 main 函数作为它的容器。
static void Main(string[] args) { Boy boy = new Boy(); Girl girl = new Girl(); girl.kiss3(boy); }
2.AOP
AOP其实是一种-Proxy模式 (代理模式) 关注主要的东西,也可以说让你只关注业务,其他的东西就让AOP帮你完成。
看下代码 我定义了一个计算的接口
/// <summary> /// 抽象主题角色(Subject) /// </summary> public interface IMath { // 方法 double Add(double x, double y); double Sub(double x, double y); double Mul(double x, double y); double Div(double x, double y); }
/// <summary> /// 真实主题角色(RealSubject)角色 /// </summary> public class Math : MarshalByRefObject, IMath { // 方法 public double Add(double x, double y) { return x + y; } public double Sub(double x, double y) { return x - y; } public double Mul(double x, double y) { return x * y; } public double Div(double x, double y) { return x / y; } }
我通过代理来实现,但是这时候我 Math 类只会做 加法Add 方法,那把其余的交给其人做。
/// <summary> /// 远程代理对象 Remote "Proxy Object" /// 代理主题(Proxy)角色 /// </summary> public class MathProxy { IMath math; // 构造函数 public MathProxy() { if (math == null) math = new Math(); } // 方法 public double Add(double x, double y) { return math.Add(x, y); } public double Sub(double x, double y) { return 0; } public double Mul(double x, double y) { return 0; } public double Div(double x, double y) { return 0; } }
static void Main(string[] args) { // 创建代理和请求一个服务 Proxy p = new Proxy(); p.Request(); //创建函数 MathProxy mp = new MathProxy(); // 执行函数 Console.WriteLine("4 + 2 = {0}", mp.Add(4, 2)); Console.WriteLine("4 - 2 = {0}", mp.Sub(4, 2)); Console.WriteLine("4 * 2 = {0}", mp.Mul(4, 2)); Console.WriteLine("4 / 2 = {0}", mp.Div(4, 2)); Console.ReadLine(); }
这个过程就叫AOP。 我只关注一个加法运算 其余的交给其他人做。
3.IOC AOP 联合使用
只要改下代理就好。 通过外部的IOC容器来注入依赖对象
/// <summary> /// 远程代理对象 Remote "Proxy Object" /// 代理主题(Proxy)角色 /// </summary> public class MathProxy { IMath math; // 构造函数 public MathProxy(IMath _math) { math = _math; } // 方法 public double Add(double x, double y) { return math.Add(x, y); } public double Sub(double x, double y) { return math.Sub(x, y); } public double Mul(double x, double y) { return math.Mul(x, y); } public double Div(double x, double y) { return math.Div(x, y); } }