现在的位置: 首页 > 综合 > 正文

Inside ObjectBuilder Part 4

2013年02月17日 ⁄ 综合 ⁄ 共 3383字 ⁄ 字号 评论关闭

 

ObjectBuilderApplicationBlock

/黄忠成

2006/9/21

 

八、ObjectBuilder实务

 

8-1ObjectBuilderWithConfiguration

截至目前为止,本文一直以程序方式来配置ObjectBuidler建立对象所需的各种对象,但在实务上,这些动作应该是交由配置文件来负责,这样才能在不重新编译应用程序的情况下,改变其行为或增加其功能。很幸运的,MicrosoftObjectBuilder的范例中提供了一个途径来达到此目的,该范例定义了一个.xsd文件,其内定义了ConstructorInjectionSetterInjectionSingletonTypeMapping所需要的schema,当然!这个xsd中也定义了Strategyschema,允许设计者通过配置文件来添加对象建立时所需使用的Strategys

 

ConsturctorInjectionWithConfiguration

我将Microsoft所提供可配置ObjectBuidler的范例中关于处理配置文件时的.xsd及相关文件提取出来,并添加MethodInjection时所需要的schema及程序代码,放置于本文的范例程序档中,当读者们需要使用配置文件这个功能时,可以将Config目录中的ObjectBuilderXmlConfig.xsdObjectBuilderXmlConfig.xsxObjectBuilderXmlConfig.csObjectBuilderXmlConfig.Generate.cs等文件复制到项目目录中,并将ObjectBuilderXmlConfig.xsdObjectBuilderXmlConfig.Generate.cs加入到项目中,完成后再将ObjectBuilderXmlConfig.xsd设置成EmbeddedResource,如图10所示。

10


接着将修改ObjectBuilderXmlConfig.cs中关于由Resource中取得.xsd内容的程序代码,修正namespace为项目的默认namespace即可。

程序44

privatestaticObjectBuilderXmlConfigParseXmlConfiguration(stringconfig)

{

XmlSerializerser=newXmlSerializer(typeof(ObjectBuilderXmlConfig));

StringReaderstringReader=newStringReader(config);

XmlSchemaschema=

XmlSchema.Read(

Assembly.GetExecutingAssembly().GetManifestResourceStream(

"OB_CSConfigurationTest.ObjectBuilderXmlConfig.xsd"),null);

XmlReaderSettingssettings=newXmlReaderSettings();

settings.ValidationType=ValidationType.Schema;

settings.Schemas.Add(schema);

XmlReaderreader=XmlReader.Create(stringReader,settings);

ObjectBuilderXmlConfigconfigData=(ObjectBuilderXmlConfig)ser.Deserialize(reader);

returnconfigData;

}

 

要使用配置文件来完成ConstructorInjection,我们必须在项目中新增一个xml文件,内容如下所示。

 

object-builder-configxmlns="pag-object-builder">

build-rules>

build-rule

type="OB_ConfigurationTest.InputAccept,OB_CSConfigurationTest"mode="Instance">

constructor-params>

ref-param

type="OB_ConfigurationTest.PromptDataProcessor,OB_CSConfigurationTest"/>

constructor-params>

build-rule>

build-rules>

object-builder-config>

 

ObjectBuilderXmlConfig.xsd定义中,build-rules代表着此BuilderContext中所有的对象建立规则,每个build-rule对应着一个“类型/id”,类型格式为id部份则可通过添加name这个attribute来设置,未指定时就以null为默认值,如下。

 

build-rule

type="OB_ConfigurationTest.InputAccept,OB_CSConfigurationTest"

name=”id1”mode="Instance">

 

每个build-rule可以拥有一个constructor-params区段,设计者可以在这个区段中添加value-param或是ref-param定义,前者是直接设置该参数的值,后者是通过reference方式来设值,本例中是将InputAccept建构子的第一个参数值指定为PromptDataProcessor。程序45是使用这个配置文件的程序列表。

 

程序45

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

usingSystem.IO;

usingSystem.Configuration;

usingMicrosoft.Practices.ObjectBuilder;

usingMicrosoft.Practices.EnterpriseLibrary.Common.Configuration.ObjectBuilder;

usingMicrosoft.Practices.EnterpriseLibrary.Common.Configuration;

 

namespaceOB_ConfigurationTest

{

classProgram

{

staticvoidMain(string[]args)

{

using(FileStreamfs=newFileStream("XmlFile1.xml",FileMode.Open,FileAccess.Read))

{

using(StreamReadersr=newStreamReader(fs))

{

Builderbuilder=newBuilder(ObjectBuilderXmlConfig.FromXml(sr.ReadToEnd()));

InputAcceptaccept=builder.BuildUpInputAccept>(newLocator(),null,null);

accept.Execute();

Console.Read();

}

}

}

}

 

publicclassInputAccept

{

privateIDataProcessor_dataProcessor;

 

publicvoidExecute()

{

Console.Write("PleaseInputsomewords:");

stringinput=Console.ReadLine();

input=_dataProcessor.ProcessData(input);

Console.WriteLine(input);

}

 

publicInputAccept([Dependency(Name="dataProcessor")]IDataProcessordataProcessor)

{

_dataProcessor=dataProcessor;

}

}

 

publicinterfaceIDataProcessor

{

stringProcessData(stringinput);

}

 

抱歉!评论已关闭.