Castle Windsor之入门

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还有很多注册方式,下文介绍。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值