日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unity 配置:typeConverter的使用

發布時間:2025/3/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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);
????????}

????}

?修改后最終的配置文件:

<?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="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的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。