Unity 配置:typeConverter的使用
生活随笔
收集整理的這篇文章主要介紹了
Unity 配置:typeConverter的使用
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
本文主要介紹自己在使用Unity時(shí)碰到的一個(gè)問(wèn)題,及解決方案。
由于本人不擅長(zhǎng)寫(xiě)作,所以文字都很簡(jiǎn)單,各位還是主要看代碼及DEMO吧。
首先先看一下以下代碼:
????public?interface?ILogger
????{
????????void?Write();
????}
????public?class?FlatFileLogger?:?ILogger
????{
????????private?Message?_message;
????????public?FlatFileLogger(Message?message)
????????{
????????????_message?=?message;
????????}
????????public?void?Write()
????????{
????????????Console.WriteLine(String.Format("Message:{0}",?_message));
????????????Console.WriteLine("Target:FlatFile");
????????}
????}
????public?class?Message
????{
????????private?string?_message;
????????private?Message(string?message)
????????{
????????????_message?=?message;
????????}
????????public?override?string?ToString()
????????{
????????????return?_message.ToString();
????????}
????????public?static?Message?CreateMessage(string?message)
????????{
????????????return?new?Message(message);
????????}
????}
????class?Program
????{
????????static?void?Main(string[]?args)
????????{
????????????IUnityContainer?container?=?new?UnityContainer();
????????????UnityConfigurationSection?section?=?(UnityConfigurationSection)ConfigurationManager.GetSection("unity");
????????????section.Containers["containerOne"].Configure(container);
????????????ILogger?log?=?container.Resolve<ILogger>();
????????????log.Write();
????????????Console.ReadLine();
????????}
????}
配置文件:
<?xml?version="1.0"?encoding="utf-8"??>
<configuration>
????<configSections>
????????<section?name="unity"?type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,
?????????????????Microsoft.Practices.Unity.Configuration,?Version=1.0.0.0,
?????????????????Culture=neutral,?PublicKeyToken=31bf3856ad364e35"?/>
????</configSections>
????<unity>
????????<typeAliases>
????????????<typeAlias?alias="string"?type="System.String,?mscorlib"?/>
????????????<!--?Lifetime?manager?types?-->
????????????<typeAlias?alias="singleton"
?????????????????type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager,
???????????????Microsoft.Practices.Unity"?/>
????????????<typeAlias?alias="external"
?????????????????type="Microsoft.Practices.Unity.ExternallyControlledLifetimeManager,
???????????????Microsoft.Practices.Unity"?/>
????????????<!--?User-defined?type?aliases?-->
????????????<typeAlias?alias="ILogger"?type="UnityDemo.ILogger,?UnityDemo"?/>
????????????<typeAlias?alias="FlatFileLogger"?type="UnityDemo.FlatFileLogger,?UnityDemo"?/>
????????????<typeAlias?alias="Message"?type="UnityDemo.Message,?UnityDemo"?/>
????????</typeAliases>
????????<containers>
????????????<container?name="containerOne">
????????????????<types>
?????????????????????<type?type="ILogger"?mapTo="FlatFileLogger"/>
????????????????</types>
????????????</container>
????????</containers>
????</unity>
</configuration>
一運(yùn)行程序就報(bào)錯(cuò),那是因?yàn)镸essage類的構(gòu)造函數(shù)是私有的,Unity無(wú)法自動(dòng)裝配。
本來(lái)父對(duì)象的構(gòu)造函數(shù)如果需要指定具體值,可以通過(guò)修改配置文件來(lái)達(dá)到目的,配置修改如下:
<type?type="ILogger"?mapTo="FlatFileLogger">
????????????????????????<typeConfig?extensionType="Microsoft.Practices.Unity.Configuration.TypeInjectionElement,
?????????????????????????????????????Microsoft.Practices.Unity.Configuration">
????????????????????????????<constructor>
????????????????????????????????<param?name="message"?parameterType="Message">
????????????????????????????????????<value?value="Some?Value"></value>
????????????????????????????????</param>
????????????????????????????</constructor>
????????????????????????</typeConfig>
????????????????????</type>
但現(xiàn)在還有一個(gè)問(wèn)題,就是由于參數(shù)message的類型是自定義類型,不是像string, int等系統(tǒng)類型, 按以上配置是無(wú)法把一個(gè)Message的實(shí)例傳給FlatFileLogger的構(gòu)造函數(shù)的。這時(shí)就需要用到typeConverter,把value中的值轉(zhuǎn)換成一個(gè)Message的實(shí)例。
LoggerConverter:
???public?class?LoggerConverter?:?TypeConverter
????{
????????public?override?bool?CanConvertFrom(ITypeDescriptorContext?context,?Type?sourceType)
????????{
????????????if?(sourceType?==?typeof(string))
????????????{
????????????????return?true;
????????????}
????????????return?base.CanConvertFrom(context,?sourceType);
????????}
????????public?override?object?ConvertFrom(ITypeDescriptorContext?context,
???????????CultureInfo?culture,?object?value)
????????{
????????????if?(value?is?string)
????????????{
????????????????return?Message.CreateMessage(value.ToString());
????????????}
????????????return?base.ConvertFrom(context,?culture,?value);
????????}
????}
<configuration>
????<configSections>
????????<section?name="unity"?type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,
?????????????????Microsoft.Practices.Unity.Configuration,?Version=1.0.0.0,
?????????????????Culture=neutral,?PublicKeyToken=31bf3856ad364e35"?/>
????</configSections>
????<unity>
????????<typeAliases>
????????????<typeAlias?alias="string"?type="System.String,?mscorlib"?/>
????????????<!--?Lifetime?manager?types?-->
????????????<typeAlias?alias="singleton"
?????????????????type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager,
???????????????Microsoft.Practices.Unity"?/>
????????????<typeAlias?alias="external"
?????????????????type="Microsoft.Practices.Unity.ExternallyControlledLifetimeManager,
???????????????Microsoft.Practices.Unity"?/>
????????????<!--?User-defined?type?aliases?-->
????????????<typeAlias?alias="ILogger"?type="UnityDemo.ILogger,?UnityDemo"?/>
????????????<typeAlias?alias="FlatFileLogger"?type="UnityDemo.FlatFileLogger,?UnityDemo"?/>
????????????<typeAlias?alias="LoggerConverter"?type="UnityDemo.LoggerConverter,?UnityDemo"?/>
????????????<typeAlias?alias="Message"?type="UnityDemo.Message,?UnityDemo"?/>
????????</typeAliases>
????????<containers>
????????????<container?name="containerOne">
????????????????<types>
?????????????????????<type?type="ILogger"?mapTo="FlatFileLogger"?name="FlatFileLogger"?/>
?????????????????????<type?type="ILogger"?mapTo="DatabaseLogger"?name="DatabaseLogger"/>
?????????????????????
?????????????????????<type?type="ILogger"?mapTo="FlatFileLogger">
????????????????????????<typeConfig?extensionType="Microsoft.Practices.Unity.Configuration.TypeInjectionElement,
?????????????????????????????????????Microsoft.Practices.Unity.Configuration">
????????????????????????????<constructor>
????????????????????????????????<param?name="message"?parameterType="Message">
????????????????????????????????????<value?value="FlatFileLogger"?type="Message"?typeConverter="LoggerConverter"></value>
????????????????????????????????</param>
????????????????????????????</constructor>
????????????????????????</typeConfig>
????????????????????</type>
????????????????????
????????????????</types>
????????????</container>
????????</containers>
????</unity>
</configuration>
經(jīng)過(guò)修改后,程序終于可以正常運(yùn)行了。
運(yùn)行結(jié)果:
?
本文代碼
由于本人不擅長(zhǎng)寫(xiě)作,所以文字都很簡(jiǎn)單,各位還是主要看代碼及DEMO吧。
首先先看一下以下代碼:
????public?interface?ILogger
????{
????????void?Write();
????}
????public?class?FlatFileLogger?:?ILogger
????{
????????private?Message?_message;
????????public?FlatFileLogger(Message?message)
????????{
????????????_message?=?message;
????????}
????????public?void?Write()
????????{
????????????Console.WriteLine(String.Format("Message:{0}",?_message));
????????????Console.WriteLine("Target:FlatFile");
????????}
????}
????public?class?Message
????{
????????private?string?_message;
????????private?Message(string?message)
????????{
????????????_message?=?message;
????????}
????????public?override?string?ToString()
????????{
????????????return?_message.ToString();
????????}
????????public?static?Message?CreateMessage(string?message)
????????{
????????????return?new?Message(message);
????????}
????}
????class?Program
????{
????????static?void?Main(string[]?args)
????????{
????????????IUnityContainer?container?=?new?UnityContainer();
????????????UnityConfigurationSection?section?=?(UnityConfigurationSection)ConfigurationManager.GetSection("unity");
????????????section.Containers["containerOne"].Configure(container);
????????????ILogger?log?=?container.Resolve<ILogger>();
????????????log.Write();
????????????Console.ReadLine();
????????}
????}
配置文件:
<?xml?version="1.0"?encoding="utf-8"??>
<configuration>
????<configSections>
????????<section?name="unity"?type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,
?????????????????Microsoft.Practices.Unity.Configuration,?Version=1.0.0.0,
?????????????????Culture=neutral,?PublicKeyToken=31bf3856ad364e35"?/>
????</configSections>
????<unity>
????????<typeAliases>
????????????<typeAlias?alias="string"?type="System.String,?mscorlib"?/>
????????????<!--?Lifetime?manager?types?-->
????????????<typeAlias?alias="singleton"
?????????????????type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager,
???????????????Microsoft.Practices.Unity"?/>
????????????<typeAlias?alias="external"
?????????????????type="Microsoft.Practices.Unity.ExternallyControlledLifetimeManager,
???????????????Microsoft.Practices.Unity"?/>
????????????<!--?User-defined?type?aliases?-->
????????????<typeAlias?alias="ILogger"?type="UnityDemo.ILogger,?UnityDemo"?/>
????????????<typeAlias?alias="FlatFileLogger"?type="UnityDemo.FlatFileLogger,?UnityDemo"?/>
????????????<typeAlias?alias="Message"?type="UnityDemo.Message,?UnityDemo"?/>
????????</typeAliases>
????????<containers>
????????????<container?name="containerOne">
????????????????<types>
?????????????????????<type?type="ILogger"?mapTo="FlatFileLogger"/>
????????????????</types>
????????????</container>
????????</containers>
????</unity>
</configuration>
一運(yùn)行程序就報(bào)錯(cuò),那是因?yàn)镸essage類的構(gòu)造函數(shù)是私有的,Unity無(wú)法自動(dòng)裝配。
本來(lái)父對(duì)象的構(gòu)造函數(shù)如果需要指定具體值,可以通過(guò)修改配置文件來(lái)達(dá)到目的,配置修改如下:
<type?type="ILogger"?mapTo="FlatFileLogger">
????????????????????????<typeConfig?extensionType="Microsoft.Practices.Unity.Configuration.TypeInjectionElement,
?????????????????????????????????????Microsoft.Practices.Unity.Configuration">
????????????????????????????<constructor>
????????????????????????????????<param?name="message"?parameterType="Message">
????????????????????????????????????<value?value="Some?Value"></value>
????????????????????????????????</param>
????????????????????????????</constructor>
????????????????????????</typeConfig>
????????????????????</type>
但現(xiàn)在還有一個(gè)問(wèn)題,就是由于參數(shù)message的類型是自定義類型,不是像string, int等系統(tǒng)類型, 按以上配置是無(wú)法把一個(gè)Message的實(shí)例傳給FlatFileLogger的構(gòu)造函數(shù)的。這時(shí)就需要用到typeConverter,把value中的值轉(zhuǎn)換成一個(gè)Message的實(shí)例。
LoggerConverter:
???public?class?LoggerConverter?:?TypeConverter
????{
????????public?override?bool?CanConvertFrom(ITypeDescriptorContext?context,?Type?sourceType)
????????{
????????????if?(sourceType?==?typeof(string))
????????????{
????????????????return?true;
????????????}
????????????return?base.CanConvertFrom(context,?sourceType);
????????}
????????public?override?object?ConvertFrom(ITypeDescriptorContext?context,
???????????CultureInfo?culture,?object?value)
????????{
????????????if?(value?is?string)
????????????{
????????????????return?Message.CreateMessage(value.ToString());
????????????}
????????????return?base.ConvertFrom(context,?culture,?value);
????????}
????}
?修改后最終的配置文件:
<configuration>
????<configSections>
????????<section?name="unity"?type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,
?????????????????Microsoft.Practices.Unity.Configuration,?Version=1.0.0.0,
?????????????????Culture=neutral,?PublicKeyToken=31bf3856ad364e35"?/>
????</configSections>
????<unity>
????????<typeAliases>
????????????<typeAlias?alias="string"?type="System.String,?mscorlib"?/>
????????????<!--?Lifetime?manager?types?-->
????????????<typeAlias?alias="singleton"
?????????????????type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager,
???????????????Microsoft.Practices.Unity"?/>
????????????<typeAlias?alias="external"
?????????????????type="Microsoft.Practices.Unity.ExternallyControlledLifetimeManager,
???????????????Microsoft.Practices.Unity"?/>
????????????<!--?User-defined?type?aliases?-->
????????????<typeAlias?alias="ILogger"?type="UnityDemo.ILogger,?UnityDemo"?/>
????????????<typeAlias?alias="FlatFileLogger"?type="UnityDemo.FlatFileLogger,?UnityDemo"?/>
????????????<typeAlias?alias="LoggerConverter"?type="UnityDemo.LoggerConverter,?UnityDemo"?/>
????????????<typeAlias?alias="Message"?type="UnityDemo.Message,?UnityDemo"?/>
????????</typeAliases>
????????<containers>
????????????<container?name="containerOne">
????????????????<types>
?????????????????????<type?type="ILogger"?mapTo="FlatFileLogger"?name="FlatFileLogger"?/>
?????????????????????<type?type="ILogger"?mapTo="DatabaseLogger"?name="DatabaseLogger"/>
?????????????????????
?????????????????????<type?type="ILogger"?mapTo="FlatFileLogger">
????????????????????????<typeConfig?extensionType="Microsoft.Practices.Unity.Configuration.TypeInjectionElement,
?????????????????????????????????????Microsoft.Practices.Unity.Configuration">
????????????????????????????<constructor>
????????????????????????????????<param?name="message"?parameterType="Message">
????????????????????????????????????<value?value="FlatFileLogger"?type="Message"?typeConverter="LoggerConverter"></value>
????????????????????????????????</param>
????????????????????????????</constructor>
????????????????????????</typeConfig>
????????????????????</type>
????????????????????
????????????????</types>
????????????</container>
????????</containers>
????</unity>
</configuration>
經(jīng)過(guò)修改后,程序終于可以正常運(yùn)行了。
運(yùn)行結(jié)果:
?
本文代碼
轉(zhuǎn)載于:https://www.cnblogs.com/NickYao/archive/2008/05/04/1181804.html
總結(jié)
以上是生活随笔為你收集整理的Unity 配置:typeConverter的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java url 传值乱码问题_java
- 下一篇: 做毕设时遇到的一些问题,以及一些小技巧