随笔 - 27  文章 - 1 评论 - 83 trackbacks - 2

赞助商广告

与我联系

搜索

 

常用链接

留言簿(1)

随笔分类

随笔档案

文章分类

好友的Blog

牛人的Blog

积分与排名

  • 积分 - 12856
  • 排名 - 2790

最新评论

阅读排行榜

评论排行榜

   

  简介
 
 
    从OO到AOP,一路走来就是眼花缭乱的术语,蒙蔽了这些东西的本来面目。如果你还在驻足,那你就该尝试着看看这个软件开发的世界里,是谁在狂欢!

     Martin Fowler 很大师,两篇论文就搞的开发界鸡飞狗跳、鸡犬不宁。一篇当然是《Inversion of Control Containers and the Dependency Injection pattern》 (04年 控制反转和依赖注入) ,另一篇则是《Continuous Integration》(06年 持续集成)。如果提这两篇论文,则不能不说在.net开发中与之相关的框架或者工具:Spring.Net和CruiseControl.Net,而前一个也是我们要学习的对象。

    八卦:中国的体制怎么没有催生出写这些论文的人呢,论文不必是该死的教授才能写的吧!
    再八卦:题外的话,研究一个人的东西先要看他的拥有技能和所处环境,否则Context就不对了。对于Martin Fowler.我只能说深入OO,到设计模式,到重构,到测试驱动,到敏捷编程。一路下来,再认识认识Kent Beck,Rod Johnson 。想必收获不小。

  
      Spring.Net“翻译”自Java版本的Spring。这篇文章展示一些基本问题,关于理论性的东西最好去读读上面推荐的论文,不做累述。


   环境配置

    1.下载最新的框架Spring.Net 1.1.1. 并安装。
    2.新建测试的Windows Application 程序。 引用Spring.Core.dll到工程下。
    3.增加配置文件App.Config,配置Spring.Net信息如下:

   
<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  
<configSections>
    
<sectionGroup name="spring">
      
<section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
      
<section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
    
</sectionGroup>
  
</configSections>
  
<spring>
    
<context>
      
<resource uri="config://spring/objects"/>
    
</context>
    
<objects xmlns="http://www.springframework.net">
      
    
</objects>
  
</spring>
</configuration>

 objects标签是我们配置加载对象的地方。

  加载对象

    看过PetShop源代码的人对这项功能可能很熟悉,不再累述,举例说明:
   
    以下代码加载Speaker类。
   
   Speaker 类的代码。
using System;
using System.Collections.Generic;
using System.Text;

namespace SpringExample
{
    
public class Speaker
    
{
        
private string _name = "Not Modify";

        
public string Name
        
{
            
get return _name; }
            
set { _name = value; }
        }

        
private IName _nameInterface;
        
public Speaker()
        
{
 
        }

        
public Speaker(string name)
        
{
            _name 
= name;
        }

        
public IName NameInterface
        
{
            
set { _nameInterface = value; }
            
get return _nameInterface; }
        }


        
    }

}



按照以下步骤加载Speaker类。

1.在App.Config中配置Speaker 类的信息,注意在objects标签下。
<object name="Speaker"      type="SpringExample.Speaker, SpringExample">
 
</object>
2.以下为调用代码
using Spring.Context;
using Spring.Context.Support;

    
private void button1_Click(object sender, EventArgs e)
        
{
            
/*普通调用*/
            IApplicationContext ctx 
= ContextRegistry.GetContext();
            Speaker speaker 
= (Speaker)ctx.GetObject("Speaker");
            MessageBox.Show(speaker.Name);
        }
 执行结果为“No Modify”


 属性注入和构造函数注入

     注入方式有几种,可以参考Rod Johnson的《Spring框架高级编程》(Java)。 这里只以上述两种方式举例。

     Speaker类的NameInterface属性是获取IName这样的接口,我们可以在Spring.Net中配置信息,让Speaker创建后就已经有了一个可以使用的IName接口。

    以下为IName和NameImpl类的代码。
 
using System;
using System.Collections.Generic;
using System.Text;

namespace SpringExample
{
    
public interface IName
    
{
        
string MyName();
    }

}



   
using System;
using System.Collections.Generic;
using System.Text;

namespace SpringExample
{
    
public class NameImpl:IName
    
{
        
IName Members
    }

}


    
 1.配置App.Config,为Speaker类的NameInteface属性注入NameImpl类。
 
   
      <object name="Speaker"      type="SpringExample.Speaker, SpringExample">
        
<property name="NameInterface" ref="Impl"/>
      
</object>
      
<object name="Impl"        type="SpringExample.NameImpl, SpringExample">
      
</object>

 2.调用代码如下:

 
using Spring.Context;
using Spring.Context.Support;

  
private void button3_Click(object sender, EventArgs e)
        
{
            
/*属性注入*/
            IApplicationContext ctx 
= ContextRegistry.GetContext();
            Speaker speaker 
= (Speaker)ctx.GetObject("Speaker");
            MessageBox.Show(speaker.NameInterface.MyName());
        }

  执行结果是"From Spring".

 构造函数注入:

    注意看Speaker类有一个含有一个参数的构造函数,我们这次要配置该参数的值由配置文件传入。
   
  1.配置App.Config,为Speaker类的构造函数传入参数。
 
<object name="Speaker"      type="SpringExample.Speaker, SpringExample">
        
<constructor-arg index="0" value="From Construct"/>
     
      
</object>

   
 2.调用代码如下:
using Spring.Context;
using Spring.Context.Support;

 
private void button2_Click(object sender, EventArgs e)
        
{
            
/*构造注入*/
            IApplicationContext ctx 
= ContextRegistry.GetContext();
            Speaker speaker 
= (Speaker)ctx.GetObject("Speaker");
            MessageBox.Show(speaker.Name);
        }

执行结果为:From Consturct

   好了剩下的就是大家举一反三,从三到万了。

posted on 2008-04-18 12:53 最远距离 阅读(2720) 评论(18)  编辑 收藏 所属分类: C#

FeedBack:
#1楼  2008-04-18 13:36 amir [未注册用户]
这个框架很强大
  回复  引用    
#2楼  2008-04-18 13:55 Justin      
不错不错,继续提高篇
  回复  引用  查看    
#3楼  2008-04-18 14:16 小瑞克      
关注,现在没心情看,留着以后研究
  回复  引用  查看    
#4楼  2008-04-18 14:31 AndyFish      
加油,成为一经典系列
  回复  引用  查看    
支持下楼主,博客园从去年开始技术文章更新速度明显加快,俺累了,想实践但是惰性太强了,现在基本是只看不实践
  回复  引用    
#6楼  2008-04-18 15:38 BookSir Genius      
哈哈,我现在正在转战JAVA,一是为了公司项目,二是为了学习那些优秀的开源框架,但.NET我也一直在关注

SPRING也是我想学习的一个,所以顶博主一下,希望博主继续写下去
  回复  引用  查看    
#7楼  2008-04-18 16:45 bangbang [未注册用户]
对于在配置文件里写大量类型的框架,我是持反对态度的,很多时候,在由框架带来便利性的同时,造成的后果也是很严重的.
  回复  引用    
#8楼 [楼主] 2008-04-18 16:57 最远距离      
to 7楼:

本文主要是让大家了解关于Spring中使用的控制反转和依赖注入的一些实现。楼上说的那些问题是依然存在的,是不能回避的。那我们是不是就因噎弃食。或者单纯以单一方面的反对而反对。这不是大的前进的方向,也不是开发的趋势所在。没有什么东西生来就百分百完美。楼上如果发现了这个问题,是不是有什么最优的解决方法。愿闻其详!谢先。
  回复  引用  查看    
#9楼  2008-04-18 23:30 feilng [未注册用户]
本质是把代码用更加晦涩的配置方式去表达,表面的简单
  回复  引用    
#10楼  2008-04-18 23:44 works guo      
支持
  回复  引用  查看    
#11楼  2008-04-18 23:55 works guo      
Spring.Net 1.1.1还 是才更新的
  回复  引用  查看    
#12楼  2008-04-19 09:38 探矿者      
Spring.net可以给我们带来什么呢?可以解决实际中的哪些问题呢?请赐教
  回复  引用  查看    
#13楼  2008-04-19 13:32 Hafeyang      
传言Spring框架的那个公司 SpringSource 公司被Mircrosoft收购了 Spring 的AOP思想将融合至 windows的内核中 不知道这个消息是不是真的?
  回复  引用  查看    
#14楼  2008-04-19 22:27 SpyInTheCold      
那个传言是个4月1日的愚人节笑话
  回复  引用  查看    
#15楼  2008-04-20 11:34 Leon916      
好,支持!持续关注!
  回复  引用  查看    
我正想学习一下.net下的控制反转和依赖注入,关注!
  回复  引用  查看    
我先说明,博主的代码我没有实际运行过, 所以我下面说的只是我的推测,如果有什么不当,还请谅解。

对于上面的代码, 从 构造函数 注入, 楼主是不是写掉了构造函数了?
  回复  引用    
#18楼 [楼主] 2008-04-21 21:08 最远距离      
to 楼上:


不好意思,可能是我的代码风格太垃圾了,哈哈,以后会改正的!

其实构造函数已经写了,可能你没有发现:

public Speaker()
{

}
public Speaker(string name)
{
_name = name;
}

  回复  引用  查看    

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
博客园首页

新闻频道

社区

小组

博问

网摘

闪存

  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
成果网帮您增加网站收入


相关链接: