zoukankan      html  css  js  c++  java
  • 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

     

  • 相关阅读:
    Dot Net WinForm 控件开发 (七) 为属性提下拉式属性编辑器
    WinForm 程序的界面多语言切换
    c#遍历HashTable
    Dot Net WinForm 控件开发 (三) 自定义类型的属性需要自定义类型转换器
    Dot Net WinForm 控件开发 (六) 为属性提供弹出式编辑对话框
    Dot Net WinForm 控件开发 (一) 写一个最简单的控件
    Dot Net WinForm 控件开发 (四) 设置属性的默认值
    Dot Net WinForm 控件开发 (二) 给控件来点描述信息
    Dot Net WinForm 控件开发 (八) 调试控件的设计时行为
    Dot Net WinForm 控件开发 (五) 复杂属性的子属性
  • 原文地址:https://www.cnblogs.com/yahue/p/3508770.html
Copyright © 2011-2022 走看看