您的位置:首页 > 运维架构

IOC、AOP学习笔记_Step1(学习资料:吕震宇的你真的了解Ioc与AOP吗?)

2011-02-15 16:29 387 查看
首先,感谢吕老师的你真的了解Ioc与AOP吗?。本人完全是根据吕老师讲的学习,以加深理解。(吕老师不要告我抄袭呦)
1.如果有个需求,就是返回中文问候语。我开始肯定会创建一个SayHello类库,SayHello类,就有一个方法。SayHelloTo()。如下。
namespace SayHello
{
public class SayHello
{
public string SayHelloTo(string Name)
{
return "你好!"+Name;
}
}
}
创建个控制台项目IOC_Test,应用SayHello程序集,并调用。
namespace IOC_Test
{
class Program
{
static void Main(string[] args)
{
SayHello.SayHello say = new SayHello.SayHello();
Console.WriteLine(say.SayHelloTo("秋海"));
}
}
}
2.如果需求改变了,问候语可能会是中文,也可能是英文。修改代码。
第一反应,可能在原有的SayHello类中增加一个英文的方法。修改如下
namespace SayHello
{
public class SayHello
{
public string CSayHelloTo(string Name)
{
return "你好!" + Name;
}
public string ESayHelloTo(string Name)
{
return "Hello!" + Name;
}
}
这种情况下,中文英文切换的所有调用SayHello类的say.SayHelloTo("秋海")方法都得修改成say.ESayHelloTo("秋海");这种设计肯定不符合编程思想,不易维护。
3.为了应对这种情况。我们新加一个类库SayHelloGenerator,增加两个类,代码如下
namespace SayGenerator
{
public class CSayHelloGenerator
{
public string SayHelloTo(string Name)
{
return "你好!" + Name;
}
}
public class ESayHelloGenerator
{
public string SayHelloTo(string Name)
{
return "Hello!"+Name;
}
}
}
修改SayHello如下:
namespace SayHello
{
public class SayHello
{
private CSayHelloGenerator _generate;
public CSayHelloGenerator Generate
{
get
{
if (_generate == null)
{
_generate = new CSayHelloGenerator();
}
return _generate;
}
}
public string SayHelloTo(string Name)
{
return Generate.SayHelloTo(Name);
}
}
}
这样修改后,掉用SayHello的方式不变,如果中英文切换只修改SayHello。这样比较易维护。
4.但这样修改的地方,还是不太方便,为了降低耦合性,采用“增加针对接口编程”思路,修改代码。
增加接口ISayHelloGenerator。
namespace SayGenerator
{
public interface ISayHelloGenerator
{
string SayHelloTo(string Name);
}
}
修改ESayHelloGenerator和CSayHelloGenerator,实现接口。

namespace SayGenerator
{
public class ESayHelloGenerator:ISayHelloGenerator
{
#region ISayHelloGenerator 成员

public string SayHelloTo(string Name)
{
return "Hello!" + Name;
}

#endregion
}
public class CSayHelloGenerator:ISayHelloGenerator
{
#region ISayHelloGenerator 成员

public string SayHelloTo(string Name)
{
return "你好!" + Name;
}

#endregion
}
}
修改SayHello类的方法。如下
namespace SayHello
{
public class SayHello
{
private ISayHelloGenerator _generate;
public ISayHelloGenerator Generate
{
get
{
if (_generate == null)
{
_generate = new CSayHelloGenerator();
}
return _generate;
}
}
public string SayHelloTo(string Name)
{
return Generate.SayHelloTo(Name);
}
}
}
这样,如果需要中英文切换的时候,只需要修改一句,_generate = new CSayHelloGenerator()。这样就实现了针对接口编程。

5.这样问题依旧存在。整个项目中要不全部是中文,要不全部是英文。这样肯定是不行。
SayHello类代码修改如下:

public class SayHello
{
private ISayHelloGenerator _generate;
public ISayHelloGenerator Generate
{
get
{
return _generate;
}
set
{
_generate = value;
}

}
public string SayHelloTo(string Name)
{
if (Generate != null)
{
return Generate.SayHelloTo(Name);
}
else
{
return "Error ";
}
}
}
调用时,指定类型
SayHello.SayHello say = new SayHello.SayHello();
say.Generate = new SayGenerator.ESayHelloGenerator();
Console.WriteLine(say.SayHelloTo("qiuhai"));
say.Generate = new SayGenerator.CSayHelloGenerator();
Console.WriteLine(say.SayHelloTo("qiuhai"));
输出:Hello,qiuhai;你好,qiuhai;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: