Castle Windsor之入门

孟哲
2023-12-01
1、为什么需要IOC
没有IOC的时候,代码是这样写的:
IMyService service = new MyService();

其中MyService实现了接口IService。
弊端是,接口和实现没有分离(直接引用了MyService)

用IOC,是类似这样的:
IService service = container.Resolve<IService>();


其中container是IOC容器,它负责(通过配置文件或程序集反射)来查找和实例化接口的对应实现类,做到接口和实现分离(不再引用实现类)


2、Castle Windsor
Castle Windsor是IOC之一,官网: http://www.castleproject.org/。其它著名的IOC还有Spring.Net(Spring的.Net版本)等。
Castle Windsor和Spring的较大差别是,前者更倾向于尽可能少的配置,而后者一般是基于配置文件的(虽然也可以无需配置文件)

3、获取接口实现类的实例对象
如下代码是获取接口IService的实现类的实例对象:
IMyService service = container.Resolve<IMyService>();

代码相当简洁。

如果实现类的构造函数有参数,则可以调用对应的重载方法,传入参数(不太推荐这种方式):
IMyService service = Resolve<IMyService>(IDictionary arguments);

如果IService接口有多个实现,也可以调用ResolveAll方法返回数组:
IMyService[] services = container..ResolveAll<IMyService>();


4、Castle Windsor初始化
也就是要拿到上文中的container,以便执行Resolve()方法。拿到container很容易:
IWindsorContainer container = new WindsorContainer();

关键是必须在container中注册组件,也就是为每个接口和实现类进行配对,这样Windsor才知道执行.Resolve<IService>()的时候应该去对哪个类执行new XXX();
container.Register(
    Component.For<IMyService>() //接口
	.ImplementedBy<MyService>() //实现类
);


这样就为Windsor注册了接口IMyService和对应的实现类MyServiceImpl,当调用container.Resolve<IMyService>()时,Windsor就知道应该在内部执行return new MyService();


5、问题:

既然我们的目标是接口和实现分离,才引入Castle Windsor,结果注册的时候,又引用了实现类,这不是又回到原点了?

答案是否定的。步骤4只是演示了如何逐接口进行注册,实际上Windsor还有很多注册方式,下文介绍。

 类似资料: