zoukankan      html  css  js  c++  java
  • Spring.NET学习笔记10——方法的注入(基础篇) Level 200

      多数用户都会将容器中的大部分对象布署为singleton模式。当一个singleton对象需要和另一个singleton对象协作,或者一个非singleton对象需要和另一个非singleson对象协作时,Spring.NET都能很好的处理它们的依赖关系。但是,如果对象的生存周期不同,就可能会产生问题。例如,假设一个singleton对象A要使用一个非singleton(原型)对象B,A中的每个方法都会用到B的新实例。由于A是singleton对象,容器只有会创建它一次,也就是说只有一次给A的属性赋值的机会,所以不可能在每次A需要的时候都给它注入一个新的B。

    有一种解决的办法有点违背控制反转原则:类A可以通过实现IObjectFactoryAware接口来获取容器的引用,并调用GetObject("B")在每次需要的时候从容器中请求一个(新的)对象B。但这并不是一个很好的解决方案,因为客户代码此时必须要和Spring.NET发生紧耦合。

    通过方法注入,我们可以用更优雅的方式解决类似的问题。(摘自Spring.NET中文手册)

      一、查询方法注入
      Spring.NET可以动态覆盖对象的抽象方法或虚方法,并且可以在容器内查找已命名对象,查询方法注入就利用了这些功能。个人感觉查询方法注入类似抽象工厂,为之不同的是,可以不用写抽象的实现代码,通过配置文件动态的切换组件。
      在lookup-method节点配置nameobject属性

      实现代码如下:

    Code
    LookupMethod

      二、替换任意方法

      替换任意方法在项目中使用的很少,实现方法也比较复杂。至于Spring.NET为什么使用替换任意方法,我还不是很清楚,如果有知道使用场景的朋友可以给我留言。我个人认为其用途是:实现非派生类方法的重写或在IoC框架中简易的AOP拦截(这一点又不确定,以后我会写AOP方面的博客)。
      首先继承IMethodReplacer接口并实现Implement方法,object[] arguments为传入的参数。其次在replaced-method节点配置namereplacer属性,和增加arg-type节点且配置返回类型match属性
      代码如下:

    Code
    ReplacedMethod

      三、事件注入

      在Spring.NET的IoC框架中,除了提供方法注入以外,还提供事件的注入。通过事件的注入,可以使架构体系的耦合降到最低。(参考 clingingboy的 Spring.NET学习笔记(3)-注册事件注入)

      在listener节点处配置eventmethod属性指明事件名和绑定的方法,并增加ref节点设置object属性来指明调用哪个IoC容器对象。
      实现代码:

    Code
    Listener

      

      调用部分代码:

    Program

      

      输入效果:

       代码下载

      返回目录

  • 相关阅读:
    分享自Allen 《打开excel,word发送没反映OUTLOOK无法打开》
    AD域只禁用USB存储器而开放其他USB设备
    sql2000安装sp4补丁包教程_sql2000sp4
    为帮助保护您的安全,Internet Explorer已经阻止从此站点下载文件
    IExplore.exe应用程序错误解决方法
    单网卡双IP,同时上内外网
    关于
    七伤拳
    <转>在外企混的,一定要懂“外企潜台词”
    习惯
  • 原文地址:https://www.cnblogs.com/GoodHelper/p/SpringNet_Method.html
Copyright © 2011-2022 走看看