一 环境
Windows 2003
VS 2005
.net 2.0
二 例子描述
这是一个简单的HelloWorl例子,工程总共分三个项目,一个控制台项目,二个类库项目
1)类库项目:HelloType
这里定义了两个类,ChineseHello 和 EnglishHello,分别输出中文的“你好”和英文的“Hello”,它们都是从接口IHello继承。
IHello:
public
interface
IHello
... {
void SayHello(String toName);
}
... {
void SayHello(String toName);
}
ChineseHello :
using
System;
using System.Collections.Generic;
using System.Text;
namespace Ioc
... {
public class ChineseHello : IHello
...{
public void SayHello(string toName)
...{
Console.WriteLine("你好 " + toName);
}
}
}
using System.Collections.Generic;
using System.Text;
namespace Ioc
... {
public class ChineseHello : IHello
...{
public void SayHello(string toName)
...{
Console.WriteLine("你好 " + toName);
}
}
}
EnglishHello :
using
System;
using System.Collections.Generic;
using System.Text;
namespace Ioc
... {
public class EnglishHello : IHello
...{
public void SayHello(string toName)
...{
Console.WriteLine("Hello "+ toName);
}
}
}
using System.Collections.Generic;
using System.Text;
namespace Ioc
... {
public class EnglishHello : IHello
...{
public void SayHello(string toName)
...{
Console.WriteLine("Hello "+ toName);
}
}
}
2)类库项目:GenerateHello
相当于一个工作类,需引用HelloType.dll
using
System;
using System.Collections.Generic;
using System.Text;
namespace Ioc
... {
public class GenerateHello
...{
private IHello fHelloType;
public GenerateHello(string type)
...{
switch (type)
...{
case "cn":
fHelloType = new ChineseHello();
break;
default:
fHelloType = new EnglishHello();
break;
}
}
public void Generate(string toName)
...{
fHelloType.SayHello(toName);
}
}
}
using System.Collections.Generic;
using System.Text;
namespace Ioc
... {
public class GenerateHello
...{
private IHello fHelloType;
public GenerateHello(string type)
...{
switch (type)
...{
case "cn":
fHelloType = new ChineseHello();
break;
default:
fHelloType = new EnglishHello();
break;
}
}
public void Generate(string toName)
...{
fHelloType.SayHello(toName);
}
}
}
2)控件台项目:Ioc
通过type的值来New 不同的对象,从而产生不同的输出效果。
using
System;
using System.Collections.Generic;
using System.Text;
namespace Ioc
... {
class Program
...{
static void Main(string[] args)
...{
string type = "cn";
GenerateHello gen = new GenerateHello(type);
gen.Generate("Jinzhao");
Console.Read();
}
}
}
using System.Collections.Generic;
using System.Text;
namespace Ioc
... {
class Program
...{
static void Main(string[] args)
...{
string type = "cn";
GenerateHello gen = new GenerateHello(type);
gen.Generate("Jinzhao");
Console.Read();
}
}
}
这样的写法有几个问题:
1) 类之间的依赖。如果我的GenerateHello类发生了变化,控制台项目也需要重新编译。
2) 类的可扩展性。如果我要增加一种新的语言,必须改动几个地方,除了在HelloType
类中要增加一个新的类,比如FrenchHello以外,还要在GenerateHello类的Switch增加一个新的Case,以便能New这么一个对象。
上面几点,归纳起来,就是不够灵活。
那我们看下有没有其他的办法来解决这些问题。