`
happmaoo
  • 浏览: 4473296 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Inside ObjectBuilder Part 4

阅读更多
<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-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

<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区段中的propertyproperty有一个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;

}

<

分享到:
评论

相关推荐

    ObjectBuilder

    4. **生命周期管理**:ObjectBuilder还提供了对对象生命周期的管理,如单例、按需创建等,确保对象的正确创建和释放。 **ObjectBuilder与其他IoC框架的比较** ObjectBuilder虽然功能强大,但在后来的开发中,出现...

    Microsoft.Practices.ObjectBuilder2.dll

    《Microsoft.Practices.ObjectBuilder2.dll:理解对象创建框架与Unity依赖注入》 在软件开发中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它有助于提高代码的可测试性、可维护性和可扩展性...

    ObjectBuilder源码分析

    4. **调用职责链头的BuildUp方法**:Builder调用职责链头部的`BuildUp`方法,利用构建策略开始构建对象。 5. **策略构建过程**:每个策略根据需要获取具体的策略来辅助构建对象,直到所有策略构建完毕。 ##### 3.2 ...

    ObjectBuilder2:C ++ CASE工具,完整的生命周期代码生成器-开源

    ObjectBuilder是C ++代码生成CASE工具(CASE,代码生成,重构,文档生成)。 它使您可以高度抽象地创建,操作和导航类,类关系,类成员和类方法。 ObjectBuilder大大简化了C ++项目体系结构的工作。 我使用它,并且...

    Microsoft.Practices

    Microsoft.Practices.Unity.dll和Microsoft.Practices.ObjectBuilder2.dll,可治如下报错: unable to install or run the application the application requires that assembly Microsoft.Parctices.ObjectBuilder2 ...

    ObjectBuilder-开源

    ObjectBuilder是C ++ CASE工具(CASE,重构,文档生成器)。 它使您可以高度抽象地创建,操作和导航类,类关系,类成员和类方法。

    DatabaseFactory.CreateDatabase提示错误,确实dll引用

    未能加载文件或程序集“Microsoft.Practices.ObjectBuilder, Version=1.0.51205.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。系统找不到指定的文件。 说明: 执行当前 Web 请求期间,出现未处理的...

    objectbuilder_afteredition:bject Builder 是一个用于为 https 创建图形对象的编辑器

    什么是对象生成器? Object Builder 是用于为创建图形对象的编辑器。 您可以为您的客户编辑或添加新项目、服装、效果或导弹。 一些特点: 加载或编译项目更快。 将您的对象导入或导出为精灵表。...

    Microsoft.Practices.EnterpriseLibrary.Common

    包括各种Microsoft.Practices.EnterpriseLibrary.Common.dll的版本,如Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ContainerModel等

    Microsoft.Practices.EnterpriseLibrary.Data.dll等三个类

    Microsoft.Practices.EnterpriseLibrary.Data.dll Microsoft.Practices.EnterpriseLibrary.Common.dll Microsoft.Practices.ObjectBuilder.dll

    Microsoft.Practices(cab)

    Microsoft.Practices.CompositeUI.WinForms.dll Microsoft.Practices.ObjectBuilder.dll microsoft.practices.compositeui.dll

    微软企业库dll三连

    Microsoft.Practices.EnterpriseLibrary.Data.dll Microsoft.Practices.EnterpriseLibrary.Common.dll Microsoft.Practices.ObjectBuilder.dll

    VS 三个类库

    VS 三个类库DLL文件 Microsoft.Practices.EnterpriseLibrary.Common.dll Microsoft.Practices.EnterpriseLibrary.Data.dll Microsoft.Practices.ObjectBuilder.dll

    企业类库DLL

    企业类库DLL文件Microsoft.Practices.EnterpriseLibrary.Common.dll Microsoft.Practices.EnterpriseLibrary.Data.dll Microsoft.Practices.ObjectBuilder.dll Web.config User.cs

    deblector

    4. mdbgeng.dll 和 mdbgext.dll:这些是.NET框架的调试引擎和扩展。mdbgeng.dll可能是调试引擎的主要实现,而mdbgext.dll可能包含用于扩展调试功能的接口或实现。调试引擎是调试器的核心,负责与运行中的进程进行...

    python-jsonschema-objects:从JSON模式自动生成Python绑定

    什么python-jsonschema-objects提供对JSON模式的基于类的自动绑定,以供在python中使用。 请参阅以查看受支持的关键字例如,给定以下架构: { "title": "Example Schema", "type": "object", "properties": { ...

    AOP_microsoft.practices包

    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) 容器。依赖注入是一种设计模式,它有助于降低代码间的耦合度,使系统更加...

Global site tag (gtag.js) - Google Analytics