Unity 配置:typeConverter的使用
生活随笔
收集整理的這篇文章主要介紹了
Unity 配置:typeConverter的使用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文主要介紹自己在使用Unity時碰到的一個問題,及解決方案。
由于本人不擅長寫作,所以文字都很簡單,各位還是主要看代碼及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>
一運行程序就報錯,那是因為Message類的構造函數是私有的,Unity無法自動裝配。
本來父對象的構造函數如果需要指定具體值,可以通過修改配置文件來達到目的,配置修改如下:
<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>
但現在還有一個問題,就是由于參數message的類型是自定義類型,不是像string, int等系統類型, 按以上配置是無法把一個Message的實例傳給FlatFileLogger的構造函數的。這時就需要用到typeConverter,把value中的值轉換成一個Message的實例。
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>
經過修改后,程序終于可以正常運行了。
運行結果:
?
本文代碼
由于本人不擅長寫作,所以文字都很簡單,各位還是主要看代碼及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>
一運行程序就報錯,那是因為Message類的構造函數是私有的,Unity無法自動裝配。
本來父對象的構造函數如果需要指定具體值,可以通過修改配置文件來達到目的,配置修改如下:
<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>
但現在還有一個問題,就是由于參數message的類型是自定義類型,不是像string, int等系統類型, 按以上配置是無法把一個Message的實例傳給FlatFileLogger的構造函數的。這時就需要用到typeConverter,把value中的值轉換成一個Message的實例。
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>
經過修改后,程序終于可以正常運行了。
運行結果:
?
本文代碼
轉載于:https://www.cnblogs.com/NickYao/archive/2008/05/04/1181804.html
總結
以上是生活随笔為你收集整理的Unity 配置:typeConverter的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java url 传值乱码问题_java
- 下一篇: 做毕设时遇到的一些问题,以及一些小技巧