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,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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再续~根据类型字符串动态生产对象的更多相关文章
- 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 = ...
随机推荐
- [ MySql学习心得 ] --Two
五.MySql 中常用子句 1.where子句 我们都知道在查询数据时,未必会查整个表中的数据,当有条件查询时,就会用到where子句.其结构: select * from [表名] where ...
- C# 基础(8)--网络编程
套接字,客户端连接服务器,作为进程通讯机制,是基于描述IP地址和端口,是一个通讯链的句柄,其实质就是两个程序通讯用的. 非常类似于电话插座.双方通话的过程,是一方向电话机发出信号和对方从电话机接受信号 ...
- android 模拟器上网问题
android 模拟器上网问题 1.配置Adroid环境变量(Win7为例) ,启动模拟器 第一步:桌面右键——>我的电脑——>高级系统设置 第二步:高级——>环境变量——&g ...
- Linux系统目录结构
Linux系统目录结构图 目录:/ 是Linux的根目录 每个文件和目录从根目录开始,只有root用户具有该目录下的写权限: /root是root用户的主目录,这与 / 目录不一样: 目录:/bin ...
- spring的beans.xml中classpath
classpath就是代表 /WEB-INF /classes/ 这个路径(如果不理解该路径,就把一个web工程发布为war包,然后用winrar查看其包内路径就理解啦) 常用的场景: 在SSH架构中 ...
- request, session, application辨析(待更新)
作用域 request < session < application 分析 1. request 只在一次请求中有效,当请求发送变化时,信息将失效. 2. session 在当前一次会话 ...
- [转]redis-cli的一些有趣也很有用的功能
本文转至:http://www.tuicool.com/articles/Yvqm2ev http://mdba.cn/category/redis/ redis-cli我们最常用的两个参数就是-h. ...
- 【动态规划】bzoj1663 [Usaco2006 Open]赶集
http://blog.csdn.net/u011265346/article/details/44906469 #include<cstdio> #include<algorith ...
- jQuery - 自定义伪类 [:pseudoclass]
有两种创建伪类的方法, 第一种, $.extend( $.expr[':'], { // 自定义的伪类名称:group group: function(element, index, matches, ...
- 使用IConfigurationSectionHandler在web.config中增加自定义配置
一. 场景 这里仅举一个简单应用的例子,我希望在web.config里面增加网站的基本信息,如:网站名称,网站版本号,是否将网站暂时关闭等.二. 基本实现方法1. 定义配置节点对应的类:Site ...