第四章 Spring.Net 如何管理您的类___统一资源访问接口

在前面章节有童鞋提到过 关于配置文件 Objects.xml 路径的相关问题,这些东西是 IResource 接口的一些内容,接下来就详细介绍一下 IResource 接口。

  IResource 接口 位于Spring.Core.IO 命名空间下,它能够使用统一的方式描述和访问不同类型的资源。通过该接口可以使用类似多态,与协议无关的方式来处理文件和URI资源。IResource 接口继承自 IInputStream 接口,后者只有一个属性: Stream InputStream , IResource 又在其基础上添加了一系列属性用来描述资源的信息。

  如图,可以看到 IResource 接口:

第四章 Spring.Net 如何管理您的类___统一资源访问接口

IResource 接口的属性和方法:
第四章 Spring.Net 如何管理您的类___统一资源访问接口
InputStream  : 继承自 IInputStream 接口。打开并返回一个 System.IO.Stream 。每次读取都会返回新的 Stream ,调用者必须负责 Stream 的关闭工作。

Exists  : 检查资源是否存在,如果不存在就返回 false 。

IsOpen  : 返回一个布尔值,以表明该资源是否是一个已经打开的流。如果是 true ,则 InputStream 属性不能多次读取,只能是读取一次然后关闭,以防资源泄露。 IResource 接口的实现类,除了 InputStreamResource ,其他都应该将属性返回 false 。

Description  : 返回对资源的描述,比如说完整的文件名或实际的 URL 。

Uri  : 资源的 Uri 表示形式。

File : 如果资源可以被解析为一个绝对的文件路径,就返回一个 System.IO.FIleInfo 。

CreateRelative(string relativePath); 方法   :  使用类似于相对路径的字符串(./和../),创建与当前资源相关的资源。
第四章 Spring.Net 如何管理您的类___统一资源访问接口

  IResource 是一个接口,在 Spring.Net 中有几个常用的实现类,我们可以用这些实现类来进行一些操作:

第四章 Spring.Net 如何管理您的类___统一资源访问接口
AssemblyResource : 用于访问 .Net 程序集中的内嵌式资源,相应的 Uri 格式为: assembly://<AssemblyName>/<NameSpace>/<ResourceName>

ConfigSectionResource : 用于访问 .Net 的应用程序配置文件(如: App.Config )中与 Spring.Net 有关的配置。Uri 格式: config://<path to section>

FileSystemResource : 用于访问文件系统资源。Uri 格式 file://<filename> InputStreamResource : 用于包装原始的 Stream 。但不支持 Uri 格式。 UriResource : 通过诸如 http 等标准协议的方式访问资源。 Uri 格式为标准协议格式。
第四章 Spring.Net 如何管理您的类___统一资源访问接口

  上面这些都是常用的 IResource 接口实现类, 如果有童鞋想要从指定的 Uri 中载入资源,Spring.Net 也提供了一个叫 IResourceLoader 的接口。

第四章 Spring.Net 如何管理您的类___统一资源访问接口

  如果要从指定的 Uri 中载入资源,可以使用 Spring.Net 中的 IResourceLoader 接口的实现类。在 Spring.Net 的默认情况下使用的是 ConfigurableResourceLoader,但通常情况下不直接使用它。因为 IApplicationContext 接口实现了 IResourceLoader 接口 。IResourceLoader 接口中只有一个方法 

IResource GetResource(string location);

IApplicationContext 将 GetResource方法委托给 ConfigurableResourceLoader 类代理,可以支持上面列出的全部 Uri 。

第四章 Spring.Net 如何管理您的类___统一资源访问接口

  通过创建新的 IResource 实现类可以注册新的协议,但值得注意的是:要保证新类能够正确解析 Uri 字符串 ,比如 去解析一个不存在或者错误的 Uri 时,会抛出异常。

到此位置,Spring.Net 已经写了好几章了,基本上 Spring.Net 扫盲阶段就差不多到此为止。感谢支持我的朋友,在接下来的章节中,会介绍 Spring.Net 的 面向方面编程,以及事务的知识。