您的位置:首页 > 移动开发 > Unity3D

Unity 配置:typeConverter的使用

2008-05-04 14:52 288 查看
本文主要介绍自己在使用Unity时碰到的一个问题,及解决方案。

由于本人不擅长写作,所以文字都很简单,各位还是主要看代码及DEMO吧。

首先先看一下以下代码:

public interface ILogger

public class FlatFileLogger : ILogger

public class Message

class Program

<?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

<?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>

经过修改后,程序终于可以正常运行了。

运行结果:



本文代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: