charleschen的麦地

——SomeDay I Will Be Back!

导航

Spring.NET学习实践(1)---Spring.NET的构架

Posted on 2006-12-30 16:52  charleschen  阅读(2015)  评论(2编辑  收藏  举报
Spring.NET学习实践(1
Spring.NET的构架:
 
 
2004-08-04的第一版本算起,Spring.NET出来已经很久了。但是相比较他的姐姐Spring,虽然借助于 .NET 强大的反射机制,甚至拥有比原 Java 版本更强大的功能。但是不得不承认,相对于JAVA社区的人山人海,Spring.NET的人气真的是不旺。
 
在这篇笔记中,我会谈及一些概念和术语,如果你对IOC,DI, AutoWiring等概念不太熟悉的话,请在阅读本篇之前详细阅读圈内公认的几篇理论文章。找到他们很简单,放狗(Google)就可以了。
 
 
言归正传,让我们首先看一副经典的图把。


截至到2006-11-7hao 为止的Spring .NET构架图,展现出了 Spring .NET的各个模块。具有阴影的模块包含在1.0版本中,其他模块则被许诺在将来的发布中推出。
  
   从这幅图,我们可以看出Spring .NET和其老姐Spring的核心构架是完全一致的,Spring.Core 库是框架的基础, 提供依赖注入功能。
 
Spring.Aop 库提供对业务对象的面向方面编程(AOP) 的支持。Spring.Aop 库是对Spring.Core库的补充,可为声明性地建立企业应用和为业务对象提供服务提供坚实的基础。

Spring.Web 
库扩展了ASP.NET,添加了一些功能,如对ASP.NET页面的依赖注入,双向数据绑定,针对 ASP.NET 1.1Master pages(没明白这时在指什么)以及改进的本地化支持。
 
Spring.Services库可让你将任何一般对象(即没有从其他特殊的服务基类继承的对象)暴露为企业服务(Com+)或远程对象(remoting object.),使得.NET Web services 获得依赖注入的支持,并覆盖属性元数据。此外还提供了对Windows Service的集成。

Spring.Data
库提供了数据访问层的抽象,可以被多个数据访问提供者(从ADO.NET 到多个ORM 提供者)应用。它还包含一个对ADO.NET的抽象层,移除了为ADO.NET编写可怕的编码和声明性的事务管理的必要。
 
Spring.ROM将提供常用的对象/关系映射集成,支持iBatis.NET, Nhibernate.
并且提供了一些功能,比如对声明性事务管理的支持。
Spring.Core 库如同JAVA上的Core 封装包,提供了三个接口来实现依赖注入。
IObjectFactory Spring的核心容器接口, 负责管理容器内的注入对象。他提供了一个简单而优雅的工厂模式,移除了对单例和一些服务定位stub写程序的必要。允许你将真正的程序逻辑的配置和依赖的详细情况解耦。
 
作为对IObjectFactory的继承,IApplicationContext接口也在Spring.Core库中,并且添加了许多企业应用为中心的功能,例如利用资源文件进行国际化、事件传播、资源加载等。
 
由于IApplicationContext包括了IObjectFactory所有的功能,所以通常建议优先采用IApplicationContext。除了一些受限的场合比如在一个模块中,这时内存的消耗可能很关键,过多的内存占用可能导致反应速度下降。这时我们可以使用IObjectFactory
 
ObjectDefinition 是注入对象的定义接口,供 IObjectFactory / IApplicationContext 调用。
 
相信使用过Spring的朋友可以马上熟悉以上三个兄弟,实际上IObjectFactoryIApplicationContext可以完全被看作是BeanFactory, ApplicationContext.net翻版。
 
按照传统,用一HelloWorld来结束把
 
using System;
using System.Text;
using Spring.Core;
using Spring.Context;
using Spring.Context.Support;
 
namespace TestSpringNetTestHelloWorld
{
   public interface SayHi
    {
       string SayHello();
      
    }
 
    public class HelloWorld : SayHi
     {
         public string SayHello()
         {
              return "Hello, World!";
         }
     }
 
     public class Program
     {
 
        static void Main(string[] args)
        {
            StaticApplicationContext context = new StaticApplicationContext();
            context.RegisterPrototype("HelloWorld", typeof(HelloWorld), null);
 
            SayHi o = context.GetObject("HelloWorld") as SayHi;
           
            System.Windows.Forms.MessageBox.Show(o.SayHello());
        }
     }
}