Sprin.NET连载

来源:互联网 发布:分水岭算法流程 编辑:程序博客网 时间:2024/04/30 14:04

16.2.5 小结

例程相当的简单,并且不可否认它并不完整。但是它演示了使用一个直观的XML格式来把对象图标写在一起的基础。这些简单的特性将帮你完成你需求对象的80%。可配置项剩下的20%用来适用于使用偏少的Case入工厂方法,迟初始化以及….(所有这些配置项都在第三章有详细的描述)

16.2.6 日至

通常对Spring.NET的第一次使用也是对log4net的第一次介绍。为了让你能对log4net有所了解本章给出了一个快速浏览。Log4net的权威性尼西来自于log4net的网站http://logging.apache.org/log4net/,其他好的再现资源是http://www.ondotnet.com/pub/a/dotnet/2003/06/16/log4net.html?page=1以及http://haacked.com/archive/2005/03/07/2317.aspxSpring.NET使用的是1.2.9

16.3 ApplicationContextIMessageSource

16.3.1 介绍

例子Spring.Examples.AppContext展示了应用程序正文定位的上下文,重新获得资源配置中的对象,以及把内嵌的资源属性的值赋给一个对象。重新找回的值显示在一个窗口里。

应用程序上下文配置为鉴包好一个名字为messageSource并且为Spring.Context.Support.ResourceSetMessageSource类型的对象定义。这个接口提供了各种方法类重新获得在3.14.2Using The ImessageSource章节描述的本地资源如文本,图像。当创建一个IApplicationContext实例的时候,就会查找一个对象名为messageSource,并且使用实现ImessageSource的功能。

ResourceSetMessageSource使用ResourceManagers的一列来定义特定资源集合。ResourceManager2种方式。。。。。。第一种方式是指定一个两部分的字符串,它由基础资源名和自定义的程序集组成。在这个例子中有一个内嵌的资源文件,即工程中的Images.resx。第二种方式是使用helper工厂类ResourceManagerFactoryObject,它包含了基础资源名和自定义的程序集作为自己的属性。指定了ResourceManager的第二种方式是有用的,如果你想要直接访问你程序中其他部分的ResourceManager。在例程中,一个内嵌的资源文件MyResource.resx和一个西班牙的特殊的资源文件,MyResources.es.resx都在这里被声明了,相应的XML片段如下:

...
        <object name="messageSource" type="Spring.Context.Support.ResourceSetMessageSource, Spring.Core">
          <property name="resourceManagers">
            <list>
              <value>Spring.Examples.AppContext.Images, Spring.Examples.AppContext</value>
              <ref object="myResourceManager"/>
            </list>
          </property>
        </object>
  
        <object name="myResourceManager" type="Spring.Objects.Factory.Config.ResourceManagerFactoryObject, Spring.Core">
          <property name="baseName">
            <value>Spring.Examples.AppContext.MyResource</value>
          </property>
          <property name="assemblyName">
            <value>Spring.Examples.AppContext</value>
          </property>    
        </object>

...

主程序创建程序的上下文,并且通过他们的关键字找回各种资源。在代码中,所有的关键字都被声明为静态字段在类关键字。关键字bubblechamber(aka Keys.BUBBLECHAMBER)资源文件Images.resx包含图像数据。代码

Image image = ctx.GetResourceObject(Keys.BUBBLECHAMBER) as Image;

用来从上下文重新得到image。资源文件MyResource.resx包含文字资源,关键字HelloMessage (aka Keys.HELLO_MESSAGE)Hello {0} {1}能用来字符串文本格式化的目的。实例代码:

string msg = ctx.GetMessage(Keys.HELLO_MESSAGE,
                            CultureInfo.CurrentCulture,

                            "Mr.", "Anderson");

重新获得了文本字符串并且用传递的参数值替换了字符串中的占位符,从而得到结果“Hello Mr.Anderson”。当前的方式用来选择资源文件MyResource.resx。如果替换spanish就指定

CultureInfo spanishCultureInfo = new CultureInfo("es");
string esMsg = ctx.GetMessage(Keys.HELLO_MESSAGE,
                              spanishCultureInfo,

                              "Mr.", "Anderson");

那么资源文件MyResource.es.resx就被用来替换为便准的.net资源。对于.net ResourceManager来选择合适的本地资源Spring是简单的代理。Spanish版本的资源文件不同于英文版本的在于关键字HelloMessage下的文本时Hola{0}{1},返回的字符串为“Hola Mr.Anderson”。

正如你在这个例子中看到的,标题“Mr”不应该被应用于spanish本地资源。标题能被抽象出来自己的关键字,,被称为FemaleGreeting (aka Keys.FEMALE_GREETING)。信息字段0argument{0}的取代值能够通过把关键字包装在一个简单类DefaultMessageResolvable中让本地资源更明了。代码

string[] codes = {Keys.FEMALE_GREETING};
DefaultMessageResolvable dmr = new DefaultMessageResolvable(codes, null);
 
msg = ctx.GetMessage(Keys.HELLO_MESSAGE,
                     CultureInfo.CurrentCulture,

                     dmr, "Anderson");

将分配msg的值,Hello Mrs.Anderson,因此在MyResource.resx资源文件中关键字FemaleGreeting对应的值是’Mrs.’.同样,代码
esMsg = ctx.GetMessage(Keys.HELLO_MESSAGE,
                       spanishCultureInfo,

                       dmr, "Anderson");

将给esMsg赋值,Hola Senora Anderson,因此在MyResource.es.resx中关键字FemaleGreeting对应的值是Senora

本地化也能应用刀对象而不仅仅是字符串。.net 1.1框架提供了有效的类ComponentResourceManager,它能把多个资源值应用到对象属性(VS.NET2005对代码中的这个类更重的应用,他为WinForm程序生成)。例程有一个简单的类Person,它有一个整形的属性Age和一个字符串属性Name。资源文件Person.resx包含关键字的模式如下,person<PropertyName>.在这个例子中它包含person.Nameperson.Age。把资源的值赋给对象的代码如下:

Person p = new Person();
ctx.ApplyResources(p, "person", CultureInfo.CurrentUICulture);

当你也能利用Spring自身来设定这些对象的属性,简单属性的配置 使用Spring将不考虑本地化。这可能对联合方法以及使用Spring来配置Person对象引用更便利,当在一个AfterPropertiesSet回调中使用IApplicationContext来设定Person的属性时。

 
原创粉丝点击