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自动进行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,iVBORw0KGgoAAAANSUhEUgAAAQAAAAB0CAIAAADl1HtSAAAKvUlEQVR4nO2c+W9U1xXH/WsIaYFAGkxLARuzGLyAMYvxgm1wApjdLCasBakhhD3BrLaxMV7YF0MMdSIaokQoUatWlSrZkn8rW6RYitR/oDWp1AA2xjMDpq8/nOfL9X3v3Xfnzdhm5n4/OlLuHN+32DmfOfe+GRFjGIZhGD/+cMcAQD9i6D8kwI8/3EEgtAoIgNA6bAQYFL8jxHhz/I43x39EMTjho8EJOwcn7Bw8YedbZnz81sSPf0ExadcvWUzePYQicfeQxN1DE/cMTdwzdMqeoVP2DJuyd9jUvcOm7n2bImnf20n7hiftG568b3jy/uHJ+0ck7x+Rsn9EyoERKQfeSTnwTirFJ7+aZsa70z59d7oZI9M+HZl2kCJ2xsHYGSWxM0pi00tGpZeMSj80Kv3Qr2f2xKzDv2Ex+8hoijlHRs85+luKjKNjMo6OyTg2JuPYmLnHxs49Nnbu8bGZx8dmHh9HkVU6Lqs0Lqs0Lrs0LrssLrssPrssPqcsPqd8fE75+HlmJMw7kZBrxoS8ChYT8ysm5ldOzK+cNJ/i5KT5JycvoKiaXFCVyOK9U1N6Yur71WYsrE5aWJ20sCZpYU3SoprkRTXJi2qTF9cmL65NWVybsrgupbAupbAutbAudUld6pLT0yiWnp629Mz0pWemL6M4m7bsbNpyM2asOEeRvuJc+srzFDNXnp+56vzMVRdmrrowq4ji4qyii7NXU1yas+ZVZKy9bMa6y3PXXTGj+Epm8ZXM4vrM9fWZ6+uz1tdnrb+a9cHVbIoN17I3XMuh2HgtZ+Nn8zZ+Nm8TRUPupobczQ25mxvyNjfkbb6et+V63pbr+Vuu52+9QTF/6435v/sDxYJtFI0F2xoLtjdCAAgAAewEKK+sVoyCosOD4j+EABAgqgT4x937tnH33oN7D76/e//7O/ceUKa8snrQuO0QAAJElQBdgReKUV5Z/caACkC/giAAJQUBKOlZADocAjAB6A8SnQJ0d3c3NbcWHb+95sQ36059vf7MrY2Xbj5sawv4fSzm7vgi4PfZCsA/aiUBaMwE4CeEIoBZ/b07ACWFDkBJ6gDW58GuApjVP/vI6DmmCf/66TE7nAlALwdQAP6XshXA+runFtZZkySAkOQFoAx1AH5OnwrArtLnArzs7m5qbt115a97G/6y//M/ffLldyXf3FYUgM6p0gFoZv8LMDLtoGEY/sCL2BkHwyvAwHYAs+57dwBK8gK0/vPfhmEEnr9gAqQuqaPMtCWnmQDmYNnZtGVn5QJQB+gHAZgDfS5AR2dXU3Nr6a2/L62+vrD2YuH5c8vr60gAv9/n93UF/L7lV+v6TQCaGV4BGPwSiDJRLAAtgajc+SUQ/wehJRAvgHUJFOUCPO3sampufa/q8qIzF5ZeOrviWm1RY9XDtja/3886wId/22UVwOgNCcBeqgjAJrt2AJombIJ7qr/XJphVv6sAth3gVfVLBWAvBQH4a8Vnl9Ggo9PHkkwAlmECCH9PJgDLMAGEmSQAnwlWAH4JJAhASWETTElBAHYGJoBwn0wAlmECCDNzeq+CDMPgBWBJEkA4lheAzzsL8MzX1NxaeO78siunVzbUrPmisvhW2cO2tucBP78KUu8AlHQVgDJDEs1BnwrgD5hrAA8CUPUzByR7AMrEZZsD6gDsfwDfASgzIa+CDZgAQgeg5OSCKhqEqwOwRZGwCaakBwEoM3u1WfS8AEIHoGRmcT0N+A5AGWsHMAebGnI3mdWf16MBdQAa52+9QQMSgMYLtjXSwEWA5Vfrim6cWnuz4oOvjm++fehhW1vA19UPAjAkAtAE4TEoJYXHoJQUHoMaPXsA16dAdDj/GNTwJAC/BDIMo6PTJyyBaKYgwMT8SvbX6AcBnJ4C0UlIABpbH4NS3lWAjLWX2W8kCMBgAtBL2yWQObB0AEMqAN8BpEugZ76m5tbVn58s/rJ8w9dHt3xbsu3PBx62td3vwe/ztbc/efL4UR91ANdNMM0MXQD66essAO0BKNmfAtCBfSEABSWFDiDsASjvKgCNg+oALnuAZ13+m3/8rqm5lQ9egGednY8ePXr0889B7QEMw7A+BiWsewCD6wD0MlwCWK8u2QRTRkUA/oSuewBC2ASzfLj2APQYlCVJAH4aCcBnBAEYbAlEL3kBDAuh7AGMng4gzOQ3AD/99ykbWzsAz3+4mUwAhqMAjzt8xsuAYTzvDjwzXvoN46VhPP/fiy6/r8vX1fX0aceT9ift7U+edrQPyAdhdNvCJ8GUFD4JpqTnT4LpcHwSzDbB9AeJ3E+C6f6pA8gEOHyswvabP1U1p0/VnjvBZRas2IevQugjQBR8FUKpAwyK+/0b47arxKBx2/FlOAgQQQLg69AQAAJAAAgAAWwFQCD0CRsBygDQBnsBcgDQA0cBYjhaWlpsx7a4TggXQd0VAPb0tQAtFkK8YXYGxbuy3oD8TuCSXvRzBxgQAVzHTvNB9OMqgFA0rm+lirXoGQgAwkmwAljPQEnXBUa4CgtLIBBO5ALwhSKpfutL9bagiKSO5ZWNDgBkKAqgWNB9J4D8EvIO4Dp2mg+iH4kAtqVPKAqg8g4dLB4ECOo2IIBeOAkgrzMnN17DDiDMcZ0JAfTC2yZYRQ+egRVAeL+XdyEIoBfqAqjUumtnCB3+0irrGestsQxqHYQqQIyDAwKuBaqO4nzru77TGBpojaIAkiq3fXMVrtL/AkiOcl0veTg/iFSC2gOoJ1XaguuPwjI/qJvxdn4QwQQrgOJ7vLBwknSAYG+4xQ3Xq6DEwSs8dID+WbSEi9DvH0QzngUI16rGQ4GGvg3wcCC0iU5C6QBO6w22FFFZooQigOISSP3MrpfzcDh4rXH9LpD1EHnd8z/1Vu7hKmJbPYJ1JqgrgshDUQBrWau8o4ddgKBqUXGycMOhCwMiCdcvwxFC0SvWqKS4batKXmq2Nqrchvo026NQ8dGM5MtwroUoJFUKWqKENeNUeUFVpO092N6J05khQDQTylMgdT0kBCtAi3MPkVS255uJcetpILJR3wSrFJmH+mM6CZkYBzf69E3a9neEANGM4h6AR1IQ1tJxfYe2lpqTAFZVnG5DfnX5zVjHECCaUdwDuFZGTO8ClRSWkHf1QX5R+fltJ0gmO02TuAciGw8dIMZhKRKUAOwMTudxugEIAMKJyj+MZUVSHMKPJJ3EOj9GapHtfElSfsPBTpNrCSIVladAQuFKKt76UpKUHB5UM5GfX34GRf34vwAEiCpc9wDCfNeFQSgCSMrR8/nlZwhqLOlLIFJR3wM4+SBZKjjBz5S/s0rOb3sS2zNIMhL9nC4HAaIKb3sAHpV3aNdj1StYXtBCXv4jq40qZ4YAUUXoAgAQwUAAoDUQAGgNBABaAwGA1kAAoDUQAGgNBABaAwGA1kAAoDUQAGgNBABaAwGA1kAAoDUQAGgNBABaAwGA1kAAoDUQAGgNBABaAwGA1kAAoDUQAGgNBABaAwGA1kAAoDUQAGgNBABaAwGA1kAAoDUQAGgNBABaAwGA1kAAoDUQAGgNBABaAwGA1kAAoDUQAGgNBABaAwGA1kAAoDUQAGgNBABaAwGA1kAAoDUQAGgNBABaAwGA1kAAoDUQAGgNBABaAwGA1kAAoDUQAGgNBABaAwGA1kAAoDUQAGgNBAA6838dMNSLeskErwAAAABJRU5ErkJggg==" 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再续~根据类型字符串动态生产对象的更多相关文章
- python-根据字符串动态生成对象eval
# -*- coding: utf-8 -*- stock1={ 'stockName':"沈阳机床", ", 'averagePrice_yesterday':34.0 ...
- 我心中的核心组件(可插拔的AOP)~第十二回 IoC组件Unity
回到目录 说在前 Ioc组件有很多,之前也介绍过autofac,castle等,今天再来说一下在微软Nlayer DDD架构里使用的unity组件,今天主要说一下依靠注入,如果希望看拦截的用法,可以阅 ...
- 第十六回 IoC组件Unity续~批量动态为Unity添加类型和行为
回到目录 之前的一篇Unity的文章主要是基本的实现,并没有什么特别的地方,使用Unity可以方便的实现应用程序的IoC控制反转,这给我们的应用程序在耦合度上变得高了,同时可测试性加强了,当然,这些的 ...
- ASP.NET MVC IOC之Unity攻略
ASP.NET MVC IOC之Unity攻略 一.你知道IOC与DI吗? 1.IOC(Inversion of Control )——控制反转 即依赖对象不在被依赖模块的类中直接通过new来获取 先 ...
- 我心中的核心组件(可插拔的AOP)~第十三回 实现AOP的拦截组件Unity.Interception
回到目录 说在前 本节主要说一下Unity家族里的拦截组件,对于方法拦截有很多组件提供,基本上每个Ioc组件都有对它的实现,如autofac,它主要用在orchard项目里,而castle也有以拦截的 ...
- [IoC容器Unity]第四回:使用范例
1.引言 前面几个章节介绍了Unity的基本使用,主要分为程序和配置文件两种方法的使用,可以参考一下链接, [IoC容器Unity]第一回:Unity预览 [IoC容器Unity]第二回:Lifeti ...
- 控制反转-Ioc之Unity
本篇幅主要介绍控制反转的一些概念,和如何使用Unity实现Ioc.在介绍的时候,会尽量结合代码来讲解一些概念. 1.什么是DI? DI即控制反转,是将对具体实现类的依赖转变为对接口的依赖,这样在编程中 ...
- redis 系列9 对象类型(字符串,哈希,列表,集合,有序集合)与数据结构关系
一.概述 在前面章节中,主要了解了 Redis用到的主要数据结构,包括:简单动态字符串.链表(双端链表).字典.跳跃表. 整数集合.压缩列表(后面再了解).Redis没有直接使用这些数据结构来实现键值 ...
- C#匿名类型和动态解析减少定义传输类模板
C#作为强类型语言,在序列化和反序列化(json)场景中对字符串解析常常需要定义强类型模板,造成编码上的繁琐.其实可以使用匿名类型和动态解析减少json序列化时候的数据模板定义: string a = ...
随机推荐
- js性能优化
使用局部变量(尽量缩短作用域链)JavaScript引擎对变量的解析时间跟作用域链的深度有关.局部变量由于处于链尾,存取速度是最快的,因此,一个好的经验是:任何非局部变量使用超过一次时,请使用局部变量 ...
- zabbix server配置文件
这样的错误日志,并且在web端也没有画出图来. 解决方法: ①编辑zabbix服务器端的配置文件/etc/zabbix/zabbix_server.conf找到"Timeout"把 ...
- SQL Server 2012安装后找不到服务器名称的解决办法!!!
网上说使用localhost即可,确实没错,但是有的仍旧会报出无法找到错误,我在无法通过的时候又重新安装了SQLServer,这次选中全部默认安装,之前使用的是选择安装,然后发现多了几个配置,其中有一 ...
- 46. Permutations 回溯算法
https://leetcode.com/problems/permutations/ 求数列的所有排列组合.思路很清晰,将后面每一个元素依次同第一个元素交换,然后递归求接下来的(n-1)个元素的全排 ...
- Java/Android 二进制数据与String互转
将经过加密的二进制数据保存到本地的方法 byte[] src = new byte[] { 122,-69, -17, 92, -76, 52, -21, -87, -10, 105, 76, -75 ...
- appframework build目录各文件之包含内容
{ "build/css/af.ui.css": [ "css/main.css", "css/appframework.css", &qu ...
- debian下使用gitosis+gitweb搭建SSH认证的git服务器
搭建完成Git服务器后,需要使用两台机器进行测试,一台机器作为服务器端server,一台服务器作为客户端client.整个系统,需要三个计算机账户,这里假设server端的账户名为git,client ...
- 获取google翻译的音频文件_合并音频文件的方法
1. 把引文输入google 翻译,然后点击"朗读"
- Python-变量
1.Python的变量是什么 变量是用来存储计算机程序中的信息,唯一的目的是将数据存储在内存中. 2.Python变量的组成 变量由字母.数字.下划线组成: 变量的第一位不能是数字,可以是字母或下划线 ...
- Cookie与Session的区别-总结很好的文章
Cookie与Session的区别-总结很好的文章 本文分别对Cookie与Session做一个介绍和总结,并分别对两个知识点进行对比分析,让大家对Cookie和Session有一个更深入的了解,并对 ...