自定义类型Observer的定义如下:

    [Serializable]
    public class Observer
    {
        /**//// <summary>
        /// IUpdatingSender的实现
        /// </summary>
        //[XmlAttribute(AttributeName="IUpdatingSenderImplement")]
        public string IUpdatingSenderImplement { get; set; }
    }

现希望通过Castle注入属性

public Observer[] Observers { get; set; }

因为是数据配置文件可以写入如下形式

                <Observers>
                    <item type="CSDN.Space.UpdatingService.ComponentModel.Observer">
                        <item><![CDATA[<Observer><IUpdatingSenderImplement>UpdatingSenderForUpdatingObserver1</IUpdatingSenderImplement></Observer>]]></item>
                        <item><![CDATA[<Observer><IUpdatingSenderImplement>UpdatingSenderForUpdatingObserver2</IUpdatingSenderImplement></Observer>]]></item>
                    </item>
                </Observers>

因为Observer不是系统自带类型,需要为其编写自定义转换的实现

    public class ObserverTypeConverter : AbstractTypeConverter
    {
        private NLog.Logger logger = NLog.LogManager.GetLogger("ObserverTypeConverter");

        public override bool CanHandleType(Type type)
        {
            return type.IsAssignableFrom(typeof(Observer));
        }

        public override object PerformConversion(string value, Type targetType)
        {
            return (Observer)Serializer.UTF8.ConvertToObject(value, targetType);
        }

        public override object PerformConversion(IConfiguration configuration, Type targetType)
        {
            //logger.Debug("Name={0},Value={1},Count={2}", configuration.Name, configuration.Value, configuration.Attributes.Count);
            return PerformConversion(configuration.Value, targetType);
        }
    }

其中(Observer)Serializer.UTF8.ConvertToObject(value, targetType);实质是把
<![CDATA[<Observer><IUpdatingSenderImplement>UpdatingSenderForUpdatingObserver1</IUpdatingSenderImplement></Observer>]]>
的内容反序化为Observer对象

完成ObserverTypeConverter的定义后需要添加到容器IConversionManager中.

    internal class ContainerBuilder
    {
        private static readonly object ton = new object();
        private static IWindsorContainer container = null;

        public static IWindsorContainer Create()
        {
            string subPath = ConfigurationManager.AppSettings["UpdatingService.Components.ConfigurationPath"];
            string fileName = "";

            HttpContext context = HttpContext.Current;
            if (context != null)
            {
                fileName = context.Server.MapPath(String.Format("~/{0}", subPath));
            }
            else
            {
                //支持非网站程序
                fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, subPath);
            }

            IWindsorContainer iWindsorContainer = Create(fileName);

            //添加类型转换器
            IKernel kernel = iWindsorContainer.Kernel;
            IConversionManager conversionManager = (IConversionManager)kernel.GetSubSystem(SubSystemConstants.ConversionManagerKey);
            conversionManager.Add(new ObserverTypeConverter());

            return iWindsorContainer;
        }

        private static IWindsorContainer Create(string fileName)
        {
            if (container == null)
            {
                lock (ton)
                {
                    if (container == null)
                    {
                        container = new WindsorContainer(new XmlInterpreter(fileName));
                    }
                }
            }
            return container;
        }
    }

转载于:https://www.cnblogs.com/chenjunbiao/archive/2008/05/14/1760214.html

Castle的自定义类型转换相关推荐

  1. 【.NET深呼吸】基础:自定义类型转换

    照例,老周在开始吹牛之前,先讲讲小故事,这是朋友提出的建议,老TMD写技术有什么了不起的,人人都会写.后来老周想想,也确实,代码谁不会写,能写到有品位有感悟,就不容易做到.于是,老周接受了该朋友的建议 ...

  2. C#构造函数、操作符重载以及自定义类型转换

    构造器 构造器(构造函数)是将类型的实例初始化的特殊方法.构造器可分为实例构造器和类型构造器,本节将详细介绍有关内容. 实例构造器 顾名思义,实例构造器的作用就是对类型的实例进行初始化.如果类没有显示 ...

  3. AutoMapper搬运工之自定义类型转换

    前言 最近还挺忙,还有点累,一直都没更新了,实在是懒呀.正题之前先说点别的,最近公司要扩张了,需要大量开发,领导说推荐有钱可以拿,如此好机会,我就趁机做个广告.ShippingRen.com招募.NE ...

  4. day29Struts 类型转换和自定义类型转换,input视图

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC"-/ ...

  5. C# 自定义类型转换

    1.显式转换和隐式转换: int a=123; long b=a; // 从int到long的隐式转换 int c=(int) b; // 从long到int是显式转换 --------------- ...

  6. java list 自定义类型转换_java – 可以从List生成平面XML结构的XStream自定义转换器?...

    我正在使用XStream,并且有一个类如下的字段: private Map data; 我想生成这样的XML输出: test data test data test data 所以我希望map键成为元 ...

  7. 玩转spring mvc入参自定义类型转换和格式化

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 概述 最近小胖哥搞了个小程序,有几个spring mvc 接口传递了时间,时间用java 8 ...

  8. python自定义类型转换_Python JSONDecoder自定义null类型的转换

    更新12/30/2014 实现这一目标的最简单方法是使用JSONDecoder的object_hook回调,如下面的旧答案中所述.但是,由于这需要对数据中的每个键值对进行额外的函数调用,这可能会对性能 ...

  9. struts2.x自定义类型转换

    struts2的类型转换是基于OGNL(对象图像导航语言) 1   OGNL里面有一个接口TypeConverter,该接口有一个方法convertValue,convertValue该方法很复杂,里 ...

最新文章

  1. Nginx问题定位之监控进程异常退出
  2. c#+mysql 中文乱码
  3. AsyncTask中各个函数详细的调用过程,初步实现异步任务
  4. 虚拟机扩容后mysql无法使用_VMWARE 扩容踩坑记
  5. 深度学习过拟合解决方案
  6. VirtualBox没有64位选项,无法安装64位的解决方法 感谢源作者
  7. 计算机基础知识数据结构与算法,(计算机基础知识)[数据结构与算法] 图
  8. Windows phone7 开发-Zune software is not launched 【转】
  9. 2.深度学习练习:Logistic Regression with a Neural Network mindset
  10. php 设置 server 变量,php 服务器变量 $_SERVER
  11. 世界之窗如何保存html,世界之窗(文字版)
  12. 2022年锂行业研究报告
  13. 10款白嫖网站笔记整理
  14. 数据存储的未来,磁带是赢家?!
  15. 蚂蚁金服自研架构 SOFA 背后的工程师|1024快乐
  16. windows .exe 文件默认打开方式变成记事本的解决方法
  17. 【js逆向】md5加密参数破解
  18. win10计算机联接多个网络,如何设置win10电脑连接两个显示器?
  19. 计算机语言的学习方法
  20. Ubuntu18.04安装Pycharm并将其添加至左侧收藏夹

热门文章

  1. DID会固定年份吗_倍分法DID详解 (二):多时点 DID (渐进DID)
  2. python 识别图形验证码_Python图片验证码降噪处理实例!此乃识别验证码神技!...
  3. 电脑主页面上的计算机没了,电脑界面上的internet explorer 没有了
  4. java正则出现次数_正则表达式(二)—匹配次数的正则
  5. 计算机图形学前沿领域的设想,计算机图形学
  6. 图像的输入\输出和显示
  7. python利器能下载库吗_效率倍增!5款超级好用的Python工具库!
  8. 计算机的新应用论文,计算机教学应用的新创新模式论文原稿
  9. android imageview图片崩溃,android - setImageResource导致应用程序崩溃 - 堆栈内存溢出...
  10. 照片浏览器_照片审核不通过!这可能是史上最亏的中级失败理由!