[]Object Builder Application Block文/黄忠成 ;2006/9/21‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
原文链接:http://blog.csdn.net/Code6421/archive/2006/09/25/1282167.aspx‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
整理:吕震宇‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
八、ObjectBuilder实务8-1、ObjectBuilderWithConfiguration截至目前为止,本文一直以程序方式来配置ObjectBuidler建立对象所需的各种对象,但在实务上,这些动作应该是交由配置文件来负责,这样才能在不重新编译应用程序的情况下,改变其行为或增加其功能。很幸运的,Microsoft于ObjectBuilder的范例中提供了一个途径来达到此目的,该范例定义了一个.xsd文件,其内定义了ConstructorInjection、SetterInjection、Singleton、TypeMapping所需要的schema,当然!这个xsd中也定义了Strategy的schema,允许设计者通过配置文件来添加对象建立时所需使用的Strategys。‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
  • 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所示。‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
图10‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
接着将修改ObjectBuilderXmlConfig.cs中关于由Resource中取得.xsd内容的程序代码,修正namespace为项目的默认namespace即可。‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
程序44‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
private static ObjectBuilderXmlConfig ParseXmlConfiguration(string config) ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
{ ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    XmlSerializer ser = new XmlSerializer(typeof(ObjectBuilderXmlConfig)); ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    StringReader stringReader = new StringReader(config); ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    XmlSchema schema = XmlSchema.Read(Assembly.GetExecutingAssembly().GetManifestResourceStream( ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        "OB_CSConfigurationTest.ObjectBuilderXmlConfig.xsd"), null); ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    XmlReaderSettings settings = new XmlReaderSettings(); ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    settings.ValidationType = ValidationType.Schema; ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    settings.Schemas.Add(schema); ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    XmlReader reader = XmlReader.Create(stringReader, settings); ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    ObjectBuilderXmlConfig configData = (ObjectBuilderXmlConfig)ser.Deserialize(reader); ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    return configData; ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
}
‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
要使用配置文件来完成ConstructorInjection,我们必须在项目中新增一个xml文件,内容如下所示。‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
<?xml version="1.0" encoding="utf-8"?>‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
<object-builder-config xmlns="pag-object-builder" >‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    <build-rules >‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        <build-rule type="OB_ConfigurationTest.InputAccept,OB_CSConfigurationTest" mode="Instance" >‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            <constructor-params >‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
                <ref-param type="OB_ConfigurationTest.PromptDataProcessor,OB_CSConfigurationTest" />‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            </constructor-params>‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        </build-rule>‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    </build-rules>‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
</object-builder-config>
‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
在ObjectBuilderXmlConfig.xsd定义中,build-rules代表着此BuilderContext中所有的对象建立规则,每个build-rule对应着一个“类型/id”,类型格式为<type,Assembly>,id部份则可通过添加name这个attribute来设置,未指定时就以null为默认值,如下。‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
<?xml version="1.0" encoding="utf-8"?>‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
<object-builder-config xmlns="pag-object-builder" >‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    <build-rules >‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        <build-rule type="OB_ConfigurationTest.InputAccept,OB_CSConfigurationTest" name="id1" mode="Instance" >‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            ......
‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
每个build-rule可以拥有一个constructor-params区段,设计者可以在这个区段中添加value-param或是ref-param定义,前者是直接设置该参数的值,后者是通过reference方式来设值,本例中是将InputAccept构造函数的第一个参数值指定为PromptDataProcessor。程序45是使用这个配置文件的程序列表。‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
程序45‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
using System; ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
using System.Collections.Generic; ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
using System.Text; ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
using System.IO; ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
using System.Configuration; ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
using Microsoft.Practices.ObjectBuilder; ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ObjectBuilder; ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration; ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
namespace OB_ConfigurationTest ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
{ ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    class Program ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        static void Main(string[] args) ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            using (FileStream fs = new FileStream("XmlFile1.xml", FileMode.Open, FileAccess.Read)) ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
                using (StreamReader sr = new StreamReader(fs)) ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
                { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
                    Builder builder = new Builder(ObjectBuilderXmlConfig.FromXml(sr.ReadToEnd())); ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
                    InputAccept accept = builder.BuildUp<InputAccept>(new Locator(), null, null); ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
                    accept.Execute(); ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
                    Console.Read(); ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
                } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    public class InputAccept ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        private IDataProcessor _dataProcessor; ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        public void Execute() ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            Console.Write("Please Input some words:"); ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            string input = Console.ReadLine(); ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            input = _dataProcessor.ProcessData(input); ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            Console.WriteLine(input); ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        public InputAccept([Dependency(Name = "dataProcessor")]IDataProcessor dataProcessor) ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            _dataProcessor = dataProcessor; ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    public interface IDataProcessor ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        string ProcessData(string input); ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    public class DummyDataProcessor : IDataProcessor ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        #region IDataProcessor Members ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        public string ProcessData(string input) ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            return input; ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        #endregion ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    public class PromptDataProcessor : IDataProcessor ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        #region IDataProcessor Members ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        public string ProcessData(string input) ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            return "your input is:" + input; ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        #endregion ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
} ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
  • SetterInjectionWithConfiguration
同样的,我们也可以通过配置文件来完成SetterInjection,此范例所使用的配置文件如下。‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
<?xml version="1.0" encoding="utf-8"?>‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
<object-builder-config xmlns="pag-object-builder" >‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    <build-rules >‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        <build-rule type="OB_CSPropertyInjectionTest.InputAccept,OB_CSPropertyInjectionTest" mode="Instance" >‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            <property name="DataProcessor" >‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
                <ref-param type="OB_CSPropertyInjectionTest.PromptDataProcessor,OB_CSPropertyInjectionTest" />‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            </property>‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        </build-rule>‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    </build-rules>‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
</object-builder-config>
‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
设计者必须将要设置的属性定义放置于build-rule区段中的property,property有一个nameattribute,代表着欲设置属性的名称,如要设置一个以上的属性,只需添加多个property区段即可,程序46是使用此配置文件的程序代码。‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
程序46‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
using System; ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
using System.Collections.Generic; ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
using System.Text; ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
using System.IO; ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
using System.Configuration; ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
using Microsoft.Practices.ObjectBuilder; ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ObjectBuilder; ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration; ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
namespace OB_CSPropertyInjectionTest ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
{ ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    class Program ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        static void Main(string[] args) ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            using (FileStream fs = new FileStream("XmlFile1.xml", FileMode.Open, FileAccess.Read)) ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
                using (StreamReader sr = new StreamReader(fs)) ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
                { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
                    Builder builder = new Builder(ObjectBuilderXmlConfig.FromXml(sr.ReadToEnd())); ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
                    InputAccept accept = builder.BuildUp<InputAccept>(new Locator(), null, null); ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
                    accept.Execute(); ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
                    Console.Read(); ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
                } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    public class InputAccept ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        private IDataProcessor _dataProcessor; ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        [Dependency(Name = "DataProcessor")] ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        public IDataProcessor DataProcessor ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            get ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
                return _dataProcessor; ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            set ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
                _dataProcessor = value; ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        public void Execute() ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            Console.Write("Please Input some words:"); ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            string input = Console.ReadLine(); ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            input = _dataProcessor.ProcessData(input); ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            Console.WriteLine(input); ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    public interface IDataProcessor ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        string ProcessData(string input); ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    public class DummyDataProcessor : IDataProcessor ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        #region IDataProcessor Members ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        public string ProcessData(string input) ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            return input; ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        #endregion ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    public class PromptDataProcessor : IDataProcessor ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        #region IDataProcessor Members ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        public string ProcessData(string input) ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            return "your input is:" + input; ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        #endregion ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
}
‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
  • MethodInjectionWithConfiguration
Microsoft所提供的配置文件机制并未定义MethodInjection的功能,我将其稍微修改来支持此功能,下面是MethodInjection时所用的配置文件。‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
<?xml version="1.0" encoding="utf-8"?>‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
<object-builder-config xmlns="pag-object-builder" >‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    <build-rules >‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        <build-rule type="OB_CSPropertyInjectionTest.InputAccept,OB_CSPropertyInjectionTest" mode="Instance" >‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            <property name="DataProcessor" >‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
                <ref-param type="OB_CSPropertyInjectionTest.PromptDataProcessor,OB_CSPropertyInjectionTest" />‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            </property>‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        </build-rule>‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    </build-rules>‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
</object-builder-config>
‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
用法与property大致相同,程序47是程序代码列表。‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
程序47‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
using System; ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
using System.Collections.Generic; ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
using System.Text; ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
using System.IO; ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
using Microsoft.Practices.ObjectBuilder; ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
namespace OB_CSMethodInjectionTest ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
{ ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    class Program ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        static void Main(string[] args) ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            using (FileStream fs = new FileStream("XmlFile1.xml", FileMode.Open, FileAccess.Read)) ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
                using (StreamReader sr = new StreamReader(fs)) ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
                { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
                    Builder builder = new Builder(ObjectBuilderXmlConfig.FromXml(sr.ReadToEnd())); ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
                    InputAccept accept = builder.BuildUp<InputAccept>(new Locator(), null, null); ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
                    accept.Execute(); ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
                    Console.Read(); ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
                } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    public class InputAccept ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        private IDataProcessor _dataProcessor; ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        public void SetDataProcessor([Dependency(Name = "dataProcessor")]IDataProcessor dataProcessor) ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            _dataProcessor = dataProcessor; ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        public void Execute() ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            Console.Write("Please Input some words:"); ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            string input = Console.ReadLine(); ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            input = _dataProcessor.ProcessData(input); ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            Console.WriteLine(input); ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    public interface IDataProcessor ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        string ProcessData(string input); ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    public class DummyDataProcessor : IDataProcessor ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        #region IDataProcessor Members ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        public string ProcessData(string input) ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            return input; ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        #endregion ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    public class PromptDataProcessor : IDataProcessor ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        #region IDataProcessor Members ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        public string ProcessData(string input) ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        { ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
            return "your input is:" + input; ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        #endregion ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    } ‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
}
‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
  • SingletonWithConfiguration
通过配置文件,也可以定义那个“类型/id”的对象是使用Singleton模式,如下所示。‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
<build-rule type="OB_CSMethodInjectionTest.PromptDataProcessor,OB_CSMethodInjectionTest" mode="Singleton" />‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
  • TypeMappingWithConfiguration
我们也可以在配置文件中定义TypeMapping,如下所示。‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
<build-rule type="OB_CSMethodInjectionTest.IDataProcessor,OB_CSMethodInjectionTest" mode="Instance" >‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    <mapped-type type="OB_CSMethodInjectionTest.PromptDataProcessor,OB_CSMethodInjectionTest" />‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
</build-rule>
‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
  • CustomizeStrategys
通过配置文件,也可以定义建立对象时所需要的Strategys,如下所示。‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
<object-builder-config xmlns="pag-object-builder" >‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    <strategies include-default="false" >‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        <strategy type="Microsoft.Practices.ObjectBuilder.TypeMappingStrategy,Microsoft.Practices.ObjectBuilder" />‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        <strategy type="Microsoft.Practices.ObjectBuilder.CreationStrategy,Microsoft.Practices.ObjectBuilder" />‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        <strategy type="Microsoft.Practices.ObjectBuilder.MethodExecutionStrategy,Microsoft.Practices.ObjectBuilder"
/>‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
        .............‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
    </strategies>‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
</object-builder-config>
‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
include-default属性决定是否包含Builder对象所内建的Strategys。‡vډ »Äùøwww.netcsharp.cn:<åƒažõ
九、后记ObjectBuilder是一个相当不错的DependencyInjection实现对象,虽然相对于Spring、Avalon,ObjectBuilder并不是相当的完整,例如没有完整的配置文件驱动特色,但它所具备的高度延展性,可以让我们轻易的达到这个需求,且日后相信ObjectBuilder也会内建这些功能的。‡vډ »Äùøwww.netcsharp.cn:<åƒažõ