本文主要介绍自己在使用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的使用相关推荐

  1. cardboard/daydream unity配置

    cardboard/daydream unity配置 下载 unity hub 下载 GVR sdk 配置 新建项目 导入GVR SDK Build 踩了很多坑....也没教程,自己写一个了 下载 u ...

  2. Unity配置安卓打包环境JDK和SDK下载以及配置详解

    下载安装SDK 双击"SDK Manager",启动SDK Manager Tools的勾选图示选项下载即可.   API的任意选择一个,考虑向下兼容原则,可以下载最新的API. ...

  3. unity 配置 Android 打包环境

    文章目录 前言 1. 安装Android studio 2.通过Android studio配置sdk 3.下载unity需要适配的ndk 4.配置gradle 5.配置unity 前言 公司起始的业 ...

  4. unity 引用prefab_十九:Unity 配置数据(序列化)的重构

    今天看到 @Funny David 的文章从Odin插件聊基于元数据的编辑器实现,这篇文章非常好. 最后评论部分有朋友提到一个配置的麻烦点,故有感而发,说一点我的思路和处理方法: 当我们在使用unit ...

  5. Unity配置安卓JDK方法

    1.window系统安装java 下载JDK 2.首先我们需要下载java开发工具包JDK,下载地址:http://www.oracle.com/technetwork/java/javase/dow ...

  6. Unity(十四)Unity配置打包APK环境Android和Java

    吐槽:换了电脑,配置Unity打包环境又花费了大量时间.特此记录下来 (文末提供云盘文件) 以下分三部分说明配置完就可以正常打包APK了,/*第一次打包建议仔细看完*/ 1. Android环境配置 ...

  7. Unity 配置OpenXR 和 VRTK v4开发环境

    1. 为什么使用OpenXR? 简单来说就是为了跨平台.之前我整理过通过Oculus Integration 来搭建VR开发环境的文章.但这个只适用于Oculus系列的vr头显,换个牌子的vr的话可能 ...

  8. unity 配置内购_内购推荐 (IAP Promo)

    应用商店扩展 内购推荐 (IAP Promo) 集成 内购推荐 (IAP Promo) 概述 内购推荐 (IAP Promo) 让开发者可以轻松促进应用内购.使用内购推荐可以在游戏中的不同位置向不同玩 ...

  9. lua-protobuf 新手入门篇-第二章.Unity lua-protobuf 环境配置

    第一章.编译lua-protobuf支持库(Windows插件-Win10编译) 第二章.Unity & lua-protobuf 环境配置 第三章.二进制proto读取功能,与,lua-pr ...

最新文章

  1. 别人总结的批处理技巧
  2. 我成功攻击了Tomcat服务器,大佬们的反应亮了
  3. Codeforces 723D. Lakes in Berland
  4. linux中Tomcat 8 文件上传后无访问权限
  5. js中的数据类型分为两大类分别是什么_数据类型有这么重要吗?
  6. 《App后台开发运维与架构实践》第2章 App后台基础技术
  7. 解决织梦(DedeCMS)系统自定义字段图片调用问题
  8. centos7查看mysql进程显示端口_CentOS查看进程端口号以及kill操作
  9. android美颜功能吗,Android美颜sdk接入之前需要知道这些知识吗
  10. java对象与json字符串的互相转换
  11. 世界之窗如何保存html,世界之窗(文字版)
  12. Tomcat内存设置方法(转载并实践)
  13. PHP7函数大全(4553个函数)
  14. 打开其他软件时,老是弹出Xftp6安装的问题
  15. bootstrop table api
  16. C++语言基础——C++一本通:C++语言入门 1005:地球人口承载力估计
  17. python 全栈开发,Day86(上传文件,上传头像,CBV,python读写Excel,虚拟环境virtualenv)
  18. Mysql必知必会概要总结
  19. apmserv5.2.6 mysql启动失败_win7(xp) APMServ5.2.6 Apache启动失败,MYSQL启动失败 的解决办法...
  20. CISSP考试要求里的“应用密码学”内容辅助记忆趣味串讲

热门文章

  1. Zenoss学习杂记(十)
  2. CSMAR 智能财经报告分析平台帮助
  3. powerbi add visual diagram
  4. MacBook的mission control的功能
  5. 普林斯顿大学计算机科学与技术专业硕士项目拒信
  6. cleanmymac能够很方便的清理mac上面没用的软件,尤其是这个清理大文件的功能
  7. MVC4 WebAPI(一)
  8. 【C++拾遗】 从内存布局看C++虚继承的实现原理
  9. 【Storm篇】--Storm并发机制
  10. Tomcat源码分析 - 1