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

     

  • 相关阅读:
    C++中函数模板template的使用
    C++中模板template和类class的结合使用
    Python中shuffle函数
    Python中利用tkinter模块构建图形用户界面GUI
    Python中怎样初始化一个类类class?
    Python中字典的has_key方法在3.4版本中改为in
    Python中怎样对数据集整体进行映射转换类型
    matlab中怎样对矩阵的某一列进行排序而使得其他列对应移动??
    Python中怎样使用shape计算矩阵的行和列
    27.反射2.md
  • 原文地址:https://www.cnblogs.com/yahue/p/3508770.html
Copyright © 2011-2022 走看看