回到目录

这个根据类型字符串动态去生产一个接口的对象,在实现项目中用途很广,这即省去了配置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自动进行Disposeusing (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!

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

  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. Spring IOC 组件概述

    IOC 概述 IOC: Inversion of Control(控制反转), 这里其实指的是: 将程序中需要使用的 POJOs, 丢入到容器中, 解析成统一的 BeanDefinition(主要基于 ...

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

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

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

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

  4. 在.NET上如何根据字符串动态创建控件

    在.Net上用字符串动态创建控件是通过反射来实现. 首先,利用System.Type.GetType方法,获得字符串中指定的控件的类型实例. 这里需要注意这个字符串的语法,根据msdn的解释: 按名称 ...

  5. python变量类型是动态的_Python 学习 第四篇:动态类型模型

    Python的变量不用声明,赋值之后就可以直接使用,类型是在运行过程中自动确定的,这就是动态类型模型.该模型把变量和对象设计成两个不同的实体,对象是存储数据的地方,对象的类型是由初始值自动决定的,而变 ...

  6. python变量类型是动态的_【Python】python动态类型

    在python中,省去了变量声明的过程,在引用变量时,往往一个简单的赋值语句就同时完成了,声明变量类型,变量定义和关联的过程,那么python的变量到底是怎样完成定义的呢? 动态类型 python使用 ...

  7. 编程语言分类 -- 强类型与弱类型、动态类型与静态类型

    文章内容输出来源:拉勾教育 大前端高薪训练营 前言 在拉勾教育大前端高薪训练营学习的过程中,了解到编程语言除了以前常说的高级语言与低级语言之分,还可以根据类型安全分为强类型语言与弱类型语言,也可以根据 ...

  8. 【Flutter】Dart 数据类型 字符串类型 ( 字符串定义 | 字符串拼接 | 字符串 API 调用 )

    文章目录 I . 字符串定义 I . 字符串拼接 III . 字符串 API 调用 IV . 字符串 Demo 示例 I . 字符串定义 使用单引号 ' ' 和 双引号 " " 都 ...

  9. 第十八章 12判断string类型字符串是否为空

    // 12判断string类型字符串是否为空 /*#include <iostream> #include <string> using namespace std; int ...

最新文章

  1. 浅谈Transformer的初始化、参数化与标准化
  2. 《windows server 2008》FTP服务器搭建
  3. 创业公司,怎么用人更划算?
  4. linux服务器su之后变成bash-4.1#
  5. Spring学习11-Spring管理各种数据源
  6. mysql安装出现中文乱码_MySQL安装以及中文乱码问题
  7. erp系统方案书_南方电网与电缆企业ERP系统互联互通解决方案
  8. UCOS-III系统概述
  9. 混合云架构下的安全风险分析和安全解决方案建议
  10. wincc与第三方软件opc通讯_运用OPC实现WinCC与西门子SIMOTION的通讯
  11. mysql数据库的单引号用法_数据库SQL语句单引号、双引号的用法
  12. 内大计算机学院在哪个校区,2021年福建船政交通职业学院有几个校区,大一新生在哪个校区...
  13. RX580 显卡gpu总是乱跳 求解,求解答
  14. word转chm文件
  15. vue el-menu多级菜单递归
  16. Qt调试错误:The inferior stopped because it received a signal from the Operating System.SIGSEGV
  17. 模块*.ocx已加载,但对DllRegisterServer的调用失败,错误代码0x8002801c问题解决
  18. vue中日期格式转化
  19. 新闻平台聚合之腾讯新闻爬虫发布
  20. 新版TCGA数据库学习:批量下载新版TCGA数据

热门文章

  1. HDFS—常见面试题
  2. python的os模块基本使用
  3. windows下安装配置mongodb
  4. BZOJ 2668: [cqoi2012]交换棋子
  5. 程序中保存状态的方式之Cookies
  6. MFC源码不能设置断点调试
  7. HDOJ acm steps 3.1.1
  8. 如何将软件限制策略发挥大作用
  9. form表单提交时,同一个名字的input类型的两个同时提交会覆盖吗
  10. [转] 程序员面试题精选100题(35)-找出两个链表的第一个公共结点