zoukankan      html  css  js  c++  java
  • .NET IoC主流框架 01:Castle Windsor Registering components onebyone

    最近浏览园子的一篇博文各大主流.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

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    pycharm2017.3.7的安装
    SVN Working Copy xxx locked 并 cleanup失败之解
    Lua查找字符串注意
    Lua运算符
    Python操作Excel
    项目中碰到的Ajax相关的问题记录
    线程的相关概念
    val()用法和value的区别
    JSON数组对象和JSON字符串的转化,map和JSON对象之间的转化
    算法复杂度相关概念
  • 原文地址:https://www.cnblogs.com/ecin/p/2113548.html
Copyright © 2011-2022 走看看