概述
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还有很多注册方式,下文介绍。最后
以上就是默默玉米为你收集整理的Castle Windsor之入门的全部内容,希望文章能够帮你解决Castle Windsor之入门所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复