IoC组件Unity再续~根据类型字符串动态生产对象
回到目录
这个根据类型字符串动态去生产一个接口的对象,在实现项目中用途很广,这即省去了配置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再续~根据类型字符串动态生产对象相关推荐
- Spring IOC 组件概述
IOC 概述 IOC: Inversion of Control(控制反转), 这里其实指的是: 将程序中需要使用的 POJOs, 丢入到容器中, 解析成统一的 BeanDefinition(主要基于 ...
- [IoC容器Unity]第四回:使用范例
1.引言 前面几个章节介绍了Unity的基本使用,主要分为程序和配置文件两种方法的使用,可以参考一下链接, [IoC容器Unity]第一回:Unity预览 [IoC容器Unity]第二回:Lifeti ...
- 我心中的核心组件(可插拔的AOP)~第十三回 实现AOP的拦截组件Unity.Interception...
说在前 本节主要说一下Unity家族里的拦截组件,对于方法拦截有很多组件提供,基本上每个Ioc组件都有对它的实现,如autofac,它主要用在orchard项目里,而castle也有以拦截的体现,相关 ...
- 在.NET上如何根据字符串动态创建控件
在.Net上用字符串动态创建控件是通过反射来实现. 首先,利用System.Type.GetType方法,获得字符串中指定的控件的类型实例. 这里需要注意这个字符串的语法,根据msdn的解释: 按名称 ...
- python变量类型是动态的_Python 学习 第四篇:动态类型模型
Python的变量不用声明,赋值之后就可以直接使用,类型是在运行过程中自动确定的,这就是动态类型模型.该模型把变量和对象设计成两个不同的实体,对象是存储数据的地方,对象的类型是由初始值自动决定的,而变 ...
- python变量类型是动态的_【Python】python动态类型
在python中,省去了变量声明的过程,在引用变量时,往往一个简单的赋值语句就同时完成了,声明变量类型,变量定义和关联的过程,那么python的变量到底是怎样完成定义的呢? 动态类型 python使用 ...
- 编程语言分类 -- 强类型与弱类型、动态类型与静态类型
文章内容输出来源:拉勾教育 大前端高薪训练营 前言 在拉勾教育大前端高薪训练营学习的过程中,了解到编程语言除了以前常说的高级语言与低级语言之分,还可以根据类型安全分为强类型语言与弱类型语言,也可以根据 ...
- 【Flutter】Dart 数据类型 字符串类型 ( 字符串定义 | 字符串拼接 | 字符串 API 调用 )
文章目录 I . 字符串定义 I . 字符串拼接 III . 字符串 API 调用 IV . 字符串 Demo 示例 I . 字符串定义 使用单引号 ' ' 和 双引号 " " 都 ...
- 第十八章 12判断string类型字符串是否为空
// 12判断string类型字符串是否为空 /*#include <iostream> #include <string> using namespace std; int ...
最新文章
- 浅谈Transformer的初始化、参数化与标准化
- 《windows server 2008》FTP服务器搭建
- 创业公司,怎么用人更划算?
- linux服务器su之后变成bash-4.1#
- Spring学习11-Spring管理各种数据源
- mysql安装出现中文乱码_MySQL安装以及中文乱码问题
- erp系统方案书_南方电网与电缆企业ERP系统互联互通解决方案
- UCOS-III系统概述
- 混合云架构下的安全风险分析和安全解决方案建议
- wincc与第三方软件opc通讯_运用OPC实现WinCC与西门子SIMOTION的通讯
- mysql数据库的单引号用法_数据库SQL语句单引号、双引号的用法
- 内大计算机学院在哪个校区,2021年福建船政交通职业学院有几个校区,大一新生在哪个校区...
- RX580 显卡gpu总是乱跳 求解,求解答
- word转chm文件
- vue el-menu多级菜单递归
- Qt调试错误:The inferior stopped because it received a signal from the Operating System.SIGSEGV
- 模块*.ocx已加载,但对DllRegisterServer的调用失败,错误代码0x8002801c问题解决
- vue中日期格式转化
- 新闻平台聚合之腾讯新闻爬虫发布
- 新版TCGA数据库学习:批量下载新版TCGA数据