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>
经过修改后,程序终于可以正常运行了。
运行结果:
本文代码
由于本人不擅长写作,所以文字都很简单,各位还是主要看代码及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>
经过修改后,程序终于可以正常运行了。
运行结果:
本文代码
相关文章推荐
- Unity 配置:typeConverter的使用
- Microsoft.Practices.Unity使用配置文件总是报错The type name or alias could not be resolved.
- StrutsTypeConverter的使用
- ClearType Tuner - XP使用光滑字体后别忘了进行手动配置!
- Unity 学习笔记(2) -- 配置文件的使用
- Enterprise Library 5.0中使用Xml文件配置Unity2.0与ServiceLocator
- ubuntu16.04下使用matplotlib出现`TypeError: Couldn't find foreign struct converter for 'cairo.Context'`解决
- Unity的外部配置文件使用方法
- Unity使用ini配置文件
- Unity 使用教程 之 Win 配置Android环境,打包发布Apk流程详解
- 在unity使用ScriptableObject制作配置文件
- Unity使用独立配置文件的方法
- Unity&Webform(2):自定义LifetimeManager和TypeConverter使Unity从HttpContext中取值注入WebForm页面
- Unity Application Block 学习笔记之一使用配置文件
- Unity使用案例(文件配置)
- Unity使用案例(文件配置)
- spring 容器中TypeConverter对象的使用
- 使用 Unity(二):配置 Unity 、读取配置信息和获取对象
- Unity Application Block-配置文件的使用-示例(附源码下载)
- Unity Application Block-配置文件的使用-示例(附源码下载)