spring.net (2)环境搭建 对(1)例子的解释和扩充

在上文中的例子实现了spring.net 控制反转的简单例子:

但是不免其中会有一些疑问。

例子中的配置文件是什么意思:

  app.config的配置规则可以参考web.config的配置详情

  

<sectionGroup name="spring">
      <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core" />
      <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
    </sectionGroup>

  加入spring环境支持,注册了这个节点处理器后,配置文件中的<spring>节点才能起作用。

  <context>节点的type属性是可选的,在Windows应用中,其默认值就是Spring.Context.Support.XmlApplicationContext

  那么在

  上个例子中我是用了 :

<resource uri="file://objects.xml"></resource>
来指定访问文件的访问吧objects.xml里的配置信息加入resource中
这里的uri常用的还有两种方式:

assembly://程序集名/命名空名/文件名 加载嵌入的资源的xml文件
config://spring/objects 直接使用app.config 中的配置  <objects xmlns="http://www.springframework.net"/> 里的配置信息:

值得注意的是:xml配置中 xmlns="http://www.springframework.net"是必须添加的:

在上篇博客里中,容器的实例化:
IApplicationContext ctx = ContextRegistry.GetContext();//直接读取配置文件重的配置信息。

实际物理路径
  IResource input = new FileSystemResource(@"D:Objects.xml");  //实际物理路径
            IObjectFactory factory = new XmlObjectFactory(input);

程序集下寻求配置文件

 string[] xmlFiles = new string[] 
            {
                "file://Objects.xml"
            };
            IApplicationContext context = new XmlApplicationContext(xmlFiles);

            IObjectFactory factory = (IObjectFactory)context;
            Console.ReadLine();

  在objects.xml中对对象定义:

  其中: 

  对象标识符 (id和name):

  一个对象有一个或多个id,id在容器中应该是唯一的,一个对象通常只有一个标识符,如果指定了多个标识符,其余的被认为是别名。

  在xml定义对象时,用id或者name属性来定义对象的标识符。每个对象都需要用id或name属性定义至少一个标识符。id属性允许为对象定义指定一个唯一的id,因为在Spring.NET的shcema文档中,id被标识为XML元素的ID属性,XML解析器可以在其它元素引用它的时候进行验证,在配置对象标识符时,应该优先使用id属性。但是,id属性值不能包含任何XML ID不允许使用的字符。如果一定要使用这些字符,应该使用name属性,在name属性中也可以通过逗号或分号为对象指定一个或多个别名。

  Singleton和Prototype:

  对象可以通过两种模式布署:singleton和非singleton(或者叫做prototype,只是用在这里不是很合适)。当一个对象被定义为singleton时,容器中就只会有一个共享的实例,任何时候通过id或别名请求该对象都会返回这个共享实例的引用(也就是说这个对象只会被创建一次)。

  当使用非singleton,或者说原型模式布署时,每次请求对象都会创建新的实例。在某些场合,如果需要为每个用户返回单独的用户对象或其它对象,非singlton布署模式就比较理想。

  如果没有显式指定,对象的布署模式默认为singleton。注意非singleton(原型)模式会使Spring.NET在每次请求对象时都创建新的实例,这也许并非是我们预期的行为。所以,除非绝对需要,否则不要使用原型模式。

  property

  对对象的属性实力还,可以直接指定name="属性名" value="属性值" 或者 ref="实例化的为另一个对象的id"

  注意:在为泛型类对象指定type属性的时候要注意:第一,左尖括号<要替换成字符串“&lt;”,因为在XML中左尖括号会被认为是小于号。从可读性来讲,我们都知道这并不是理想的方式。第二,type参数值中不能包含程序集的名称,因为程序集名称要求和类型全名用逗号隔开,而在这里逗号已经被用来分隔泛型类的类型参数了。将来可能会用其它字符代替这两个符号,但目前还没找到更具可读性的方案。若要提高可读性,建议使用类型别名,如下所示:

  

<typeAliases>
 <alias name="GenericDictionary" type=" System.Collections.Generic.Dictionary&lt;,>" />
 <alias name="myDictionary" type="System.Collections.Generic.Dictionary&lt;int,string>" />
</typeAliases>

  然后,下面的对象定义:

<object id="myGenericObject" 
        type="GenericsPlay.ExampleGenericObject&lt;System.Collections.Generic.Dictionary&lt;int , string>>, GenericsPlay" />

  就可以缩短为:

  

<object id="myOtherGenericObject" 
        type="GenericsPlay.ExampleGenericObject&lt;GenericDictionary&lt;int , string>>, GenericsPlay" />

  或者更短:

<object id="myOtherOtherGenericObject" 
        type="GenericsPlay.ExampleGenericObject&lt;MyIntStringDictionary>, GenericsPlay" />

使用Spring.NET框架经常用到的一下几个文件:

Common.Logging.dll(必要)
Spring.Core.dll(必要)
Spring.Data.dll
Spring.Aop.dll(可选)
Spring.Data.NHibernate21.dll
Spring.Web.dll

 

原文地址:https://www.cnblogs.com/yahue/p/3508770.html