`
zhaohaolin
  • 浏览: 1016228 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Spring.Net入门篇(一) [转]

 
阅读更多

简介 
 
    从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
    
{
        
#region  IName Members

        
public   string  MyName()
        
{
            
return   " From Spring " ;
        }


        
#endregion

    }

}


    
 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

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

 

http://www.cnblogs.com/lwlzyjl/archive/2008/04/18/1159712.html

程序还需要引用antlr.runtime程序集

IApplicationContext ctx = ContextRegistry.GetContext()中出现问题:

1."Spring.Context.Support.ContextRegistry的类型初始值设定项引发异常 " 没有引用Common.Logging.dll

2.Error creating context 'spring.root': 元素 命名空间“http://www.springframework.net”中的“object”。 的子元素 命名空间“http://www.springframework.net”中的“constructor-arg”。 无效。应为可能元素的列表: 命名空间“http://www.springframework.net”中的“property, lookup-method, replaced-method, listener”。

原因:App.Config中constructor-arg 配置要要放在属性前面。

<?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 ">
      <object name="Speaker" type="TestSpring.Speaker, TestSpring">
        <constructor-arg index="0" value="From Construct"/>
        <property name="NameInterface" ref="Impl"/>    
      </object>
      <object name="Impl" type="TestSpring.NameImpl, TestSpring">
      </object>
    </objects>   
  </spring>
</configuration>

分享到:
评论

相关推荐

    (179722824)三相异步电机矢量控制仿真模型

    三相异步电机矢量控制仿真模型。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    一次并发导致错误分析与总结

    一次并发导致错误分析

    025 - 快手直播词和控场话术.docx

    025 - 快手直播词和控场话术

    第4章 管理信息库2024v2.pdf

    第4章 管理信息库2024v2

    (178729196)pytorch人脸表情识别数据集(2w8训练集+7k测试集)

    在本文中,我们将深入探讨如何使用PyTorch进行人脸表情识别。这个数据集包含28,000张训练图像和7,000张测试图像,专为Python开发人员设计,以研究和构建深度学习模型来理解人类的情绪。PyTorch是一个强大的深度学习框架,因其灵活性和易用性而被广泛采用,它提供了动态计算图的功能,便于构建和调试神经网络。 让我们了解人脸表情识别的基本概念。这是一个计算机视觉任务,旨在根据面部特征识别七种基本表情:高兴、悲伤、惊讶、恐惧、愤怒、厌恶和中立。这通常涉及到图像处理、特征提取和机器学习算法。 要开始使用这个数据集,你需要做以下步骤: 1. **数据预处理**:解压Datawhale_人脸情绪识别_数据集文件,然后对图像进行预处理。这可能包括调整大小、归一化像素值到0-1区间、以及数据增强,如随机翻转、裁剪或旋转,以增加模型的泛化能力。 2. **数据加载器**:使用PyTorch的`torch.utils.data.Dataset`和`DataLoader`类来创建自定义数据加载器。这将使你能批量加载数据,并在训练过程中高效地处理图像。 3. **模型构建**:选择一个适合任务的卷

    070 - 直播核心细节话术.docx

    070 - 直播核心细节话术

    基于springboot的微服务的旅行社门店系统的设计实现源码(java毕业设计完整源码+LW).zip

    功能说明:可以管理首页、个人中心、用户管理、旅行社管理、产品分类管理、门店公告管理、行政中心管理、订单信息管理、合同信息管理、社区留言、系统管理等功能模块。环境说明:开发语言:Java框架:springboot,mybatisJDK版本:JDK1.8数据库:mysql 5.7数据库工具:Navicat11开发软件:eclipse/ideaMaven包:Maven3.6

    基于springboot的校友社交系统源码(java毕业设计完整源码+LW).zip

    系统管理员主要包括首页、个人中心、用户管理、校友信息管理、校友会信息管理、加入校友会管理、活动类型管理、校友活动管理、报名申请管理、岗位管理、招聘信息管理、项目管理、校园捐赠管理、我的捐赠管理、校友相亲管理、论坛中心、系统管理。 环境说明: 开发语言:java JDK版本:jdk1.8 框架:springboot 数据库:mysql 5.7/8 数据库工具:navicat 开发软件:eclipse/idea

    АДЛИН - No Love(Instrumental).mp3

    АДЛИН - No Love(Instrumental).mp3

    基于java+springboot+mysql+微信小程序的社区超市管理系统 源码+数据库+论文(高分毕业设计).zip

    项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea、微信开发者工具 数据库:MySql5.7以上 部署环境:maven 数据库工具:navicat

    (177078646)python决策树实现鸢尾花分类

    这个项目是基于 Python 编写的,使用决策树算法对鸢尾花数据集进行分类。决策树是一种常用的监督学习算法,适用于分类和回归问题。在这个项目中,我们主要关注鸢尾花分类任务。 项目介绍: 数据集: 项目使用经典的鸢尾花数据集(Iris dataset)。这个数据集包含了三个不同种类的鸢尾花(山鸢尾、变色鸢尾、维吉尼亚鸢尾)的样本数据,每个样本有四个特征(花瓣长度、花瓣宽度、花萼长度、花萼宽度)。 决策树算法: 决策树是一种树形结构,其中每个节点代表一个特征,每个分支代表一个特征取值,每个叶子节点代表一个类别。通过对数据集进行递归划分,决策树学习从输入特征到输出标签的映射。 数据预处理: 在项目中,首先对鸢尾花数据集进行加载和预处理,包括数据的划分成训练集和测试集。 模型训练: 使用训练集训练决策树模型,让模型从数据中学习特征和类别之间的关系。 模型评估: 使用测试集对训练好的决策树模型进行评估,衡量模型的分类性能。通常使用准确率、精确度、召回率等指标进行评估。 结果展示: 最后,项目展示了决策树模型对新样本进行分类的能力,通过可视化方式展示决策树的结构。 这个项目旨在演。内容来源于网络分

    096 - 主播活跃直播间的台词.docx

    096 - 主播活跃直播间的台词

    全球地表覆盖图 -所有类型(无偏移).zip

    地表覆盖分布是气候变化研究、生态环境评估及地理国情监测等不可或缺的重要基础信息。近年来,随着卫星遥感和计算机存储与计算能力的不断增强,全球尺度中高分辨率地表覆盖产品的应用需求日益迫切。   作为全球首套2020年全球30米精细地表覆盖产品,该数据集及时反映了2020年全球陆地区域(除南极洲)在30米空间分辨率下的地表覆盖分布状况,为地表相关应用提供了最新的数据支撑,对于全球变化、可持续发展分析以及地理国情监测等具有重要意义。   经过多年研究,该团队突破了全球30米地表覆盖多时相自动化精细分类关键技术,并于2019年9月发布了精细分类体系的2015年全球30米地表覆盖精细分类产品。该团队在此基础上做了大量优化工作,例如结合定量遥感反演模型对分类体系做了进一步深化(林地二级类从区域尺度拓展为全球尺度),利用多源辅助数据集和专家先验知识集改善了原来存在的少量错分和漏分问题,针对原来存在的少许空间过渡不连续问题进行了针对性处理与优化。

    基于springboot的旧物置换网站源码(java毕业设计完整源码+LW).zip

    项目均经过测试,可正常运行! 环境说明: 开发语言:java JDK版本:jdk1.8 框架:springboot 数据库:mysql 5.7/8 数据库工具:navicat 开发软件:eclipse/idea

    (2368806)CCNA中文版PPT

    **CCNA(思科认证网络助理工程师)是网络技术领域中的一个基础认证,它涵盖了网络基础知识、IP编址、路由与交换技术等多个方面。以下是对CCNA中文版PPT中可能涉及的知识点的详细说明:** ### 第1章 高级IP编址 #### 1.1 IPv4地址结构 - IPv4地址由32位二进制组成,通常分为四段,每段8位,用点分十进制表示。 - 子网掩码用于定义网络部分和主机部分,如255.255.255.0。 - IP地址的分类:A类、B类、C类、D类(多播)和E类(保留)。 #### 1.2 子网划分 - 子网划分用于优化IP地址的分配,通过借用主机位创建更多的子网。 - 子网计算涉及掩码位数选择,以及如何确定可用的主机数和子网数。 - CIDR(无类别域间路由)表示法用于更有效地管理IP地址空间。 #### 1.3 私有IP地址 - 为了节省公网IP地址,私有IP地址被用于内部网络,如10.0.0.0/8,172.16.0.0/12,192.168.0.0/16。 #### 1.4 广播地址 - 每个网络都有一个特定的广播地址,所有数据包都会发送到这个地址以达到同一网络内的所有设备。

    汽车安全技术之ESC系统介绍及其电路配置

    内容概要:本文介绍了 ESC(Electronic Stability Control)电子稳定控制系统,这是一种用于提高汽车操控稳定性的技术,主要包括 ABS(防抱死刹车系统)、TCS(牵引力控制系统)和偏航控制。ESC 通过监测车辆动态,自动调整四个车轮的刹车,防止车轮打滑和车辆侧滑。文章还详细解释了 ESC 的电路配置,包括收发器、MCU、DC/DC 转换器、马达驱动电路和阀门驱动电路等关键组件的工作原理和所需电子零部件的特点。 适合人群:汽车行业从业者、汽车电子工程师及相关领域的研究者。 使用场景及目标:帮助读者了解 ESC 系统的基本原理和技术细节,适用于汽车安全技术研发、故障排除及系统维护等工作。 其他说明:文中还提到了未来 ESC 系统的发展趋势,包括提高刹车控制精度、小型化和冗余化、低损耗与耐热性,以及智能化和网联化等方面的内容。

    三轴转台sw2016可编辑全套技术资料100%好用.zip

    三轴转台sw2016可编辑全套技术资料100%好用.zip

    conda文件下载1111

    conda文件下载1111

    二叉树深度计算的Python与多语言实现及应用场景

    内容概要:本文详细介绍了二叉树的深度概念及其两种常见的计算方法——递归方法和层序遍历方法。提供了Python、Java和C++的代码实现,并对不同方法的优缺点进行了对比分析,解释了它们适用于不同类型二叉树的情况。 适合人群:具有一定数据结构基础的学习者,特别是对二叉树有初步了解但需要深入掌握二叉树深度计算的读者。 使用场景及目标:通过理论结合代码实例的方式,帮助学习者深刻理解二叉树的性质,掌握二叉树深度的不同计算方式,能够在实际项目中灵活选用最适合的方法进行高效计算。 阅读建议:建议读者先熟悉二叉树的基本概念,再逐步深入学习递归和层序遍历的方法。在实践中运行并调试给出的代码例子,有助于更好地吸收文章内容。

    009 - 成功暖场留人话术.docx

    009 - 成功暖场留人话术

Global site tag (gtag.js) - Google Analytics