Unity 配置:typeConverter的使用
由于本人不擅长写作,所以文字都很简单,各位还是主要看代码及DEMO吧。
首先先看一下以下代码:
{
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();
}
}
配置文件:
<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无法自动装配。
本来父对象的构造函数如果需要指定具体值,可以通过修改配置文件来达到目的,配置修改如下:
<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 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的使用相关推荐
- cardboard/daydream unity配置
cardboard/daydream unity配置 下载 unity hub 下载 GVR sdk 配置 新建项目 导入GVR SDK Build 踩了很多坑....也没教程,自己写一个了 下载 u ...
- Unity配置安卓打包环境JDK和SDK下载以及配置详解
下载安装SDK 双击"SDK Manager",启动SDK Manager Tools的勾选图示选项下载即可. API的任意选择一个,考虑向下兼容原则,可以下载最新的API. ...
- unity 配置 Android 打包环境
文章目录 前言 1. 安装Android studio 2.通过Android studio配置sdk 3.下载unity需要适配的ndk 4.配置gradle 5.配置unity 前言 公司起始的业 ...
- unity 引用prefab_十九:Unity 配置数据(序列化)的重构
今天看到 @Funny David 的文章从Odin插件聊基于元数据的编辑器实现,这篇文章非常好. 最后评论部分有朋友提到一个配置的麻烦点,故有感而发,说一点我的思路和处理方法: 当我们在使用unit ...
- Unity配置安卓JDK方法
1.window系统安装java 下载JDK 2.首先我们需要下载java开发工具包JDK,下载地址:http://www.oracle.com/technetwork/java/javase/dow ...
- Unity(十四)Unity配置打包APK环境Android和Java
吐槽:换了电脑,配置Unity打包环境又花费了大量时间.特此记录下来 (文末提供云盘文件) 以下分三部分说明配置完就可以正常打包APK了,/*第一次打包建议仔细看完*/ 1. Android环境配置 ...
- Unity 配置OpenXR 和 VRTK v4开发环境
1. 为什么使用OpenXR? 简单来说就是为了跨平台.之前我整理过通过Oculus Integration 来搭建VR开发环境的文章.但这个只适用于Oculus系列的vr头显,换个牌子的vr的话可能 ...
- unity 配置内购_内购推荐 (IAP Promo)
应用商店扩展 内购推荐 (IAP Promo) 集成 内购推荐 (IAP Promo) 概述 内购推荐 (IAP Promo) 让开发者可以轻松促进应用内购.使用内购推荐可以在游戏中的不同位置向不同玩 ...
- lua-protobuf 新手入门篇-第二章.Unity lua-protobuf 环境配置
第一章.编译lua-protobuf支持库(Windows插件-Win10编译) 第二章.Unity & lua-protobuf 环境配置 第三章.二进制proto读取功能,与,lua-pr ...
最新文章
- 别人总结的批处理技巧
- 我成功攻击了Tomcat服务器,大佬们的反应亮了
- Codeforces 723D. Lakes in Berland
- linux中Tomcat 8 文件上传后无访问权限
- js中的数据类型分为两大类分别是什么_数据类型有这么重要吗?
- 《App后台开发运维与架构实践》第2章 App后台基础技术
- 解决织梦(DedeCMS)系统自定义字段图片调用问题
- centos7查看mysql进程显示端口_CentOS查看进程端口号以及kill操作
- android美颜功能吗,Android美颜sdk接入之前需要知道这些知识吗
- java对象与json字符串的互相转换
- 世界之窗如何保存html,世界之窗(文字版)
- Tomcat内存设置方法(转载并实践)
- PHP7函数大全(4553个函数)
- 打开其他软件时,老是弹出Xftp6安装的问题
- bootstrop table api
- C++语言基础——C++一本通:C++语言入门 1005:地球人口承载力估计
- python 全栈开发,Day86(上传文件,上传头像,CBV,python读写Excel,虚拟环境virtualenv)
- Mysql必知必会概要总结
- apmserv5.2.6 mysql启动失败_win7(xp) APMServ5.2.6 Apache启动失败,MYSQL启动失败 的解决办法...
- CISSP考试要求里的“应用密码学”内容辅助记忆趣味串讲