回到目录

这个根据类型字符串动态去生产一个接口的对象,在实现项目中用途很广,这即省去了配置config文件的麻烦,又使用生产对象变更可配置,你完全可以把这种多态持久化到数据库里或者XML文件里,在使用时根据类型名称去生产对象的类型实例,非常爽,非常酷,当然也非常实用,大叔一直喜欢小平同志的话:黑猫,白猫,抓住耗子就是好猫

现在使用我来讲一个例子,也是编程里的一个Hello world的例子,传说有IHello接口,它有China和USA两种实现,什么时候用它们完成由配置决定,程序里不能写死

统一的人类

   public interface IHello
{
void HelloWorld();
}

中国人说HelloWorld

   public class China : IHello
{ public void HelloWorld()
{
Console.WriteLine("你好,世界!");
}
}

美国人说HelloWorld

 public class USA : IHello
{ public void HelloWorld()
{
Console.WriteLine("Hello World!");
}
}

我们要想动态生产对象,有很多方法,也有很多第三方的IOC组件,向autofac,castle,unity都可以实现,在大叔框架里,比较青睐于Unity,所以我们还是以Unity为例,来生产一个这个对象

           //IOC上下文,使用using自动进行Dispose
using (IUnityContainer container = new UnityContainer())
{
string helloType = "Lind.DDD.Test.China";//从配置文件或者数据库里读取信息
container.RegisterType(typeof(IHello), Type.GetType(helloType));//注意类型与实现的关系
var hello = container.Resolve<IHello>();//生产对象
hello.HelloWorld();//调用方法
}

结果当前是输出中国人的Hello world!

aaarticlea/png;base64,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" alt="" />

有一点要注意一下,对不在本程序集里的类型,需要将程序集名称写清楚,如下

  var t = Type.GetType("Lind.DDD.ConfigConstants.ConfigModel,Lind.DDD");//一般接口
var tGeneric = Type.GetType("Lind.DDD.Test.Hello`1,Lind.DDD.Test");//泛型接口

再次注意,如果泛型类型中,泛型的参数类型也不在本程序集,则需要使用下载的代码了

  tGeneric = Type.GetType("Lind.DDD.Repositories.Xml.XmlRepository`1,Lind.DDD.Repositories.Xml");//拿到泛型类型
tGeneric = tGeneric.MakeGenericType(typeof(Lind.DDD.ConfigConstants.ConfigModel));//注册泛型叁数

最后注意,如果你不希望显示的注册泛型参数,也可以使用下载的代码注册方式,更优雅

     tGeneric = Type.GetType("Lind.DDD.Repositories.Xml.XmlRepository`1[[Lind.DDD.ConfigConstants.ConfigModel,Lind.DDD]],Lind.DDD.Repositories.Xml");//拿到泛型类型

对于多语言的系统,也可以根据区域信息动态生产对象,当然IOC是我们使用这些功能的前提和基础!

回到目录

IoC组件Unity再续~根据类型字符串动态生产对象的更多相关文章

  1. python-根据字符串动态生成对象eval

    # -*- coding: utf-8 -*- stock1={ 'stockName':"沈阳机床", ", 'averagePrice_yesterday':34.0 ...

  2. 我心中的核心组件(可插拔的AOP)~第十二回 IoC组件Unity

    回到目录 说在前 Ioc组件有很多,之前也介绍过autofac,castle等,今天再来说一下在微软Nlayer DDD架构里使用的unity组件,今天主要说一下依靠注入,如果希望看拦截的用法,可以阅 ...

  3. 第十六回 IoC组件Unity续~批量动态为Unity添加类型和行为

    回到目录 之前的一篇Unity的文章主要是基本的实现,并没有什么特别的地方,使用Unity可以方便的实现应用程序的IoC控制反转,这给我们的应用程序在耦合度上变得高了,同时可测试性加强了,当然,这些的 ...

  4. ASP.NET MVC IOC之Unity攻略

    ASP.NET MVC IOC之Unity攻略 一.你知道IOC与DI吗? 1.IOC(Inversion of Control )——控制反转 即依赖对象不在被依赖模块的类中直接通过new来获取 先 ...

  5. 我心中的核心组件(可插拔的AOP)~第十三回 实现AOP的拦截组件Unity.Interception

    回到目录 说在前 本节主要说一下Unity家族里的拦截组件,对于方法拦截有很多组件提供,基本上每个Ioc组件都有对它的实现,如autofac,它主要用在orchard项目里,而castle也有以拦截的 ...

  6. [IoC容器Unity]第四回:使用范例

    1.引言 前面几个章节介绍了Unity的基本使用,主要分为程序和配置文件两种方法的使用,可以参考一下链接, [IoC容器Unity]第一回:Unity预览 [IoC容器Unity]第二回:Lifeti ...

  7. 控制反转-Ioc之Unity

    本篇幅主要介绍控制反转的一些概念,和如何使用Unity实现Ioc.在介绍的时候,会尽量结合代码来讲解一些概念. 1.什么是DI? DI即控制反转,是将对具体实现类的依赖转变为对接口的依赖,这样在编程中 ...

  8. redis 系列9 对象类型(字符串,哈希,列表,集合,有序集合)与数据结构关系

    一.概述 在前面章节中,主要了解了 Redis用到的主要数据结构,包括:简单动态字符串.链表(双端链表).字典.跳跃表. 整数集合.压缩列表(后面再了解).Redis没有直接使用这些数据结构来实现键值 ...

  9. C#匿名类型和动态解析减少定义传输类模板

    C#作为强类型语言,在序列化和反序列化(json)场景中对字符串解析常常需要定义强类型模板,造成编码上的繁琐.其实可以使用匿名类型和动态解析减少json序列化时候的数据模板定义: string a = ...

随机推荐

  1. Android数据库安全解决方案,使用SQLCipher进行加解密

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11952409 我们都知道,Android系统内置了SQLite数据库,并且提供了一 ...

  2. Modelsim6.5在Ubuntu12.04的安装过程

    注:本人是在虚拟机Ubuntu12.04安装成功的,但是在虚拟机Ubuntu11.10却没有安装成功,具体原因至今未详,以后如果知道再补充吧.本博文主要的参考博文是http://blog.csdn.n ...

  3. 《UML大战需求分析》阅读笔记6

    流程分析三剑客之总结 顺序图,活动图相类似表示活动,状态机图表示状态.分析特点: 顺序图: 强调角色之间的交互,信息明确: 从上到下,从左到右,按时间顺序: 不适合表达复杂特殊情况(循环分支,条件分支 ...

  4. mysql字段类型

    会安装mysql,会几条sql语句,会jdbc,会hibernate配置,以为就会mysql了,最近几天面试被问到mysql的问题,无地自容,系统的学习一下. mysql优化之一,选择合适的而不是最大 ...

  5. Centos 7下搭建WordPress

    1,首先安装MySQL. http://www.cnblogs.com/zyh120/p/6066983.html 2,继续安装httpd,php,php-mysql这3个服务. [root@loca ...

  6. 闲来无事——第一弹 Java基础 基本数据类型

    一个优秀的Java类一定要去优质的名称,类的命名主要有字母和数字,并且必须以字母开头:虽然说没有明确规定类名首字母要大写,但是实际上如果出现首字母小写的类名,那就呵呵了,坐等挨骂吧!类名首字母大写是业 ...

  7. MAC PRO 的网关在哪里

    mac pro的网关就是路由器地址. 1.路由器在系统偏好设置里 2.双击点开此图标 选中1.然后点击高级设置 3.选中TCP/IP,然后查看自己的路由器后边的数字,就是你的mac网关号 4.IPV4 ...

  8. Hyper-v虚拟机文件VHDX与VHD的格式转换

    今天遇到一个坑,我在本机(windows 10)上创建的CentOS虚拟机作为docker的宿主机,部署了gitlab等容器,准备迁移到服务器上的时候,发现始终无法导入,提示必须通过Hyper-v导出 ...

  9. 转行IT行业的心路历程3

    16年丝袜生意很差的一年,老板的态度也不好,大唐本地人太歧视外地人了.而且我干的不开心没有前途,不能体现自我价值,无论你怎么努力. IT技术行业却不是这样,只要你努力肯学习,一定会有回报的. 在16/ ...

  10. loading动画效果记录

    看到好多网页都有一个炫酷的loading动画,以前不知道怎么实现的.今天学习了一下,发现其实也很简单. 首先在学习的时候偶然遇到一个pace.js的库,非常好用.优点是,不需要挂接到任何代码,自动检测 ...