.NET IoC主流框架 01:Castle Windsor - Registering components one-by-one
2011-07-22 09:39 Ecin 阅读(1105) 评论(0) 编辑 收藏 举报最近浏览园子的一篇博文各大主流.Net的IOC框架性能测试比较时,细看了下其中Castle Windosor的注入方式,代码片段如下:
container.Register(Component.For(typeof(IDatabase)).ImplementedBy(typeof(SqlDatabase)));
心中顿时一丝凉意,哦,现在已经是.NET 4.0了,Castle Windsor也升级了,比之前的旧模式注册方式不同了:
container.AddComponent...
带着兴奋,我毫不犹豫的看了下官网关于Castle IoC的更新,现在的版本已经更新到了2.5.3了,下了一个,研究了其新版本的用法,原来跟函数式的写法更近一步了。下面的要讲的就是我的一些研究学习成功,当然,已经对新版本的用法了然于胸的园友可以就此绕过了。
学习最新的版本,官网有很多这方面的文档可以学习的,作为最基础的,还是抛开那些配置文件之类的东东吧,让我们先从最简单的Registering components one-by-one着手吧。
1.准备性工作
这里我简单的写了几个要作为测试的接口和类:
其中,需要重点看下Dog类实例化的方式,它的实例化依赖于ILog服务:
public Dog(string name,ILog log)
2.说下官网的实现步骤:Three Calls Pattern,也就是:
a. Call one – bootstrapper
配置容器->实例化容器WindsorContainer并将其服务、组件注入到容器中
b.Call two –Resolve
在应用程序中调用需要的服务
c.Call three-Dispose
应用程序关闭时,应当释放容器,当然.net垃圾回收器会我们做好处理。
下面是我依照官网的做法的代码例子:
var container = new WindsorContainer(); container.Register(Component.For<ILog>().ImplementedBy<FileLog>()); container.Register(Component.For<IAnimal>().ImplementedBy<Dog>().DependsOn(Property.ForKey("Name").Eq("Tom"))); container.Register(Component.For<IAnimal>().ImplementedBy<Cat>()); container.Register(Component.For<IRepository<Dog>>().ImplementedBy<MemoryRepository<Dog>>()); var animal = container.Resolve<IAnimal>(); animal.Sleep(); var repository = container.Resolve<IRepository<Dog>>(); repository.Add(animal as Dog); Console.WriteLine(repository.Count); Console.Read();
在测试的时候跟之前的版本没什么两样,规则依然没变,保留着自动装配组件优良方式。黄色代码部分省略了对Dog类实例化时的第二个参数ILog,而让容器去自动装配该实现的组件。
参考资料:http://docs.castleproject.org/Windsor.Three-Calls-Pattern.ashx
源代码下载:Castle_IoC_01.rar