代码改变世界

.NET IoC主流框架 01:Castle Windsor - Registering components one-by-one

2011-07-22 09:39  Ecin  阅读(1094)  评论(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.准备性工作

这里我简单的写了几个要作为测试的接口和类:

mock

其中,需要重点看下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