<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/46860.html" frameborder="0" width="468" scrolling="no" height="60"></iframe>
ObjectBuilderApplicationBlock
文/黄忠成
<chsdate w:st="on" year="2006" month="9" day="21" islunardate="False" isrocdate="False"><strong><span lang="EN-US" style="FONT-SIZE: 11pt; COLOR: navy; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">2006/9/21</span></strong></chsdate>
八、ObjectBuilder实务
8-1、ObjectBuilderWithConfiguration
截至目前为止,本文一直以程序方式来配置ObjectBuidler建立对象所需的各种对象,但在实务上,这些动作应该是交由配置文件来负责,这样才能在不重新编译应用程序的情况下,改变其行为或增加其功能。很幸运的,Microsoft于ObjectBuilder的范例中提供了一个途径来达到此目的,该范例定义了一个.xsd文件,其内定义了ConstructorInjection、SetterInjection、Singleton、TypeMapping所需要的schema,当然!这个xsd中也定义了Strategy的schema,允许设计者通过配置文件来添加对象建立时所需使用的Strategys。
ConsturctorInjectionWithConfiguration
我将Microsoft所提供可配置ObjectBuidler的范例中关于处理配置文件时的.xsd及相关文件提取出来,并添加MethodInjection时所需要的schema及程序代码,放置于本文的范例程序档中,当读者们需要使用配置文件这个功能时,可以将Config目录中的ObjectBuilderXmlConfig.xsd、ObjectBuilderXmlConfig.xsx、ObjectBuilderXmlConfig.cs、ObjectBuilderXmlConfig.Generate.cs等文件复制到项目目录中,并将ObjectBuilderXmlConfig.xsd、ObjectBuilderXmlConfig.Generate.cs加入到项目中,完成后再将ObjectBuilderXmlConfig.xsd设置成EmbeddedResource,如图10所示。
图10
<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 243pt; HEIGHT: 143.25pt" alt="" type="#_x0000_t75"><imagedata o:href="http://p.blog.csdn.net/images/p_blog_csdn_net/Code6421/693f90a1883a4842980668cc79a9f09f.png" src="file:///C:%5CDOCUME~1%5Cdinla%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.png"></imagedata></shape>
接着将修改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”,类型格式为<type></type>,id部份则可通过添加name这个attribute来设置,未指定时就以null为默认值,如下。
build-rule type="OB_ConfigurationTest.InputAccept,OB_CSConfigurationTest" name=”id<chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="1" unitname="”">1”</chmetcnv>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); } publicclassDummyDataProcessor:IDataProcessor { #regionIDataProcessorMembers publicstringProcessData(stringinput) { returninput; } #endregion } publicclassPromptDataProcessor:IDataProcessor { #regionIDataProcessorMembers publicstringProcessData(stringinput) { return"yourinputis:"+input; } #endregion } } |
SetterInjectionWithConfiguration
同样的,我们也可以通过配置文件来完成SetterInjection,此范例所使用的配置文件如下。
object-builder-configxmlns="pag-object-builder"> build-rules> build-rule type="OB_CSPropertyInjectionTest.InputAccept,OB_CSPropertyInjectionTest"mode="Instance"> propertyname="DataProcessor"> ref-param type="OB_CSPropertyInjectionTest.PromptDataProcessor,OB_CSPropertyInjectionTest"/> property> build-rule> build-rules> object-builder-config> |
设计者必须将要设置的属性定义放置于build-rule区段中的property,property有一个nameattribute,代表着欲设置属性的名称,如要设置一个以上的属性,只需添加多个property区段即可,程序46是使用此配置文件的程序代码。
程序46
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_CSPropertyInjectionTest { 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; [Dependency(Name="DataProcessor")] publicIDataProcessorDataProcessor { get { return_dataProcessor; } set { _dataProcessor=value; } } publicvoidExecute() { Console.Write("PleaseInputsomewords:"); stringinput=Console.ReadLine(); input=_dataProcessor.ProcessData(input); Console.WriteLine(input); } } publicinterfaceIDataProcessor { stringProcessData(stringinput); } publicclassDummyDataProcessor:IDataProcessor { #regionIDataProcessorMembers publicstringProcessData(stringinput) { returninput; }<
分享到:
Global site tag (gtag.js) - Google Analytics
|
相关推荐
4. **生命周期管理**:ObjectBuilder还提供了对对象生命周期的管理,如单例、按需创建等,确保对象的正确创建和释放。 **ObjectBuilder与其他IoC框架的比较** ObjectBuilder虽然功能强大,但在后来的开发中,出现...
《Microsoft.Practices.ObjectBuilder2.dll:理解对象创建框架与Unity依赖注入》 在软件开发中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它有助于提高代码的可测试性、可维护性和可扩展性...
4. **调用职责链头的BuildUp方法**:Builder调用职责链头部的`BuildUp`方法,利用构建策略开始构建对象。 5. **策略构建过程**:每个策略根据需要获取具体的策略来辅助构建对象,直到所有策略构建完毕。 ##### 3.2 ...
ObjectBuilder是C ++代码生成CASE工具(CASE,代码生成,重构,文档生成)。 它使您可以高度抽象地创建,操作和导航类,类关系,类成员和类方法。 ObjectBuilder大大简化了C ++项目体系结构的工作。 我使用它,并且...
Microsoft.Practices.Unity.dll和Microsoft.Practices.ObjectBuilder2.dll,可治如下报错: unable to install or run the application the application requires that assembly Microsoft.Parctices.ObjectBuilder2 ...
ObjectBuilder是C ++ CASE工具(CASE,重构,文档生成器)。 它使您可以高度抽象地创建,操作和导航类,类关系,类成员和类方法。
未能加载文件或程序集“Microsoft.Practices.ObjectBuilder, Version=1.0.51205.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。系统找不到指定的文件。 说明: 执行当前 Web 请求期间,出现未处理的...
什么是对象生成器? Object Builder 是用于为创建图形对象的编辑器。 您可以为您的客户编辑或添加新项目、服装、效果或导弹。 一些特点: 加载或编译项目更快。 将您的对象导入或导出为精灵表。...
包括各种Microsoft.Practices.EnterpriseLibrary.Common.dll的版本,如Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ContainerModel等
Microsoft.Practices.EnterpriseLibrary.Data.dll Microsoft.Practices.EnterpriseLibrary.Common.dll Microsoft.Practices.ObjectBuilder.dll
Microsoft.Practices.CompositeUI.WinForms.dll Microsoft.Practices.ObjectBuilder.dll microsoft.practices.compositeui.dll
Microsoft.Practices.EnterpriseLibrary.Data.dll Microsoft.Practices.EnterpriseLibrary.Common.dll Microsoft.Practices.ObjectBuilder.dll
VS 三个类库DLL文件 Microsoft.Practices.EnterpriseLibrary.Common.dll Microsoft.Practices.EnterpriseLibrary.Data.dll Microsoft.Practices.ObjectBuilder.dll
企业类库DLL文件Microsoft.Practices.EnterpriseLibrary.Common.dll Microsoft.Practices.EnterpriseLibrary.Data.dll Microsoft.Practices.ObjectBuilder.dll Web.config User.cs
4. mdbgeng.dll 和 mdbgext.dll:这些是.NET框架的调试引擎和扩展。mdbgeng.dll可能是调试引擎的主要实现,而mdbgext.dll可能包含用于扩展调试功能的接口或实现。调试引擎是调试器的核心,负责与运行中的进程进行...
什么python-jsonschema-objects提供对JSON模式的基于类的自动绑定,以供在python中使用。 请参阅以查看受支持的关键字例如,给定以下架构: { "title": "Example Schema", "type": "object", "properties": { ...
4. **Unity.Interception.dll**:这是Unity容器的一个扩展,提供了拦截器(Interceptor)功能,实现了AOP中的动态代理。拦截器允许在方法调用前后插入自定义的行为,例如,可以添加日志记录、事务控制、性能计时等。...
5. **依赖库与组件**:其他如`Microsoft.Practices.ObjectBuilder.dll`、`WHC.Pager.WinControl.dll`等库文件,分别涉及对象构建和分页控件,这些都是构建高效用户界面和提高程序可扩展性的关键组件。`Interop.VBIDE...
3. **Microsoft.Practices.ObjectBuilder.dll**:这是一个依赖注入(Dependency Injection,DI)框架,也称为 inversion of control (IoC) 容器。依赖注入是一种设计模式,它有助于降低代码间的耦合度,使系统更加...