回到目录

这个根据类型字符串动态去生产一个接口的对象,在实现项目中用途很广,这即省去了配置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. jQuery .css color 重写 :hover样式没了

    $("#quickSqlDiv a").css({"color":"red"}); $("#course a").css ...

  2. Tiled Map地图编辑器键盘快捷键

    Tiled是款不错的地图编辑器,不过快捷键真是隐蔽啊,不看github上得wiki根本不知道,用的过程中查英文文档总是觉得慢,所以翻译成了中文. 通用 右键点击图块(tile):复制图块到图章刷(拖动 ...

  3. js中replace的回调函数使用。

    这只是一个小问题,但是之前并没有发现.这个问题就是replace的第二个函数是支持回调函数的. var ext = new RegExp('f','g'); 1.str.replace(ext ,1) ...

  4. beanstalkd----协议

    Beanstalkd中文协议 总括 beanstalkd协议基于ASCII编码运行在tcp上.客户端连接服务器并发送指令和数据,然后等待响应并关闭连接.对于每个连接,服务器按照接收命令的序列依次处理并 ...

  5. springboot使用之一:连接生产数据库,添加连接池

    项目中,难免遇到连接数据库的情形,目前来说springboot连接mybatis有两种,我这边使用的是mybatis官方提供XML方式的整合. 后面,对项目进行完善,引入了连接池,PageHelper ...

  6. <转>exe & dll自我更新

    exe & dll自我更新 分类: c/c++ 2008-10-16 22:07 756人阅读 评论(1) 收藏 举报 exedlldelayapi游戏 exe与dll的自我更新     在改 ...

  7. pundit

    gem "pundit" Include Pundit in your application controller: class ApplicationController &l ...

  8. 命令行中mysql乱码问题

    1.现象  在命令行中,执行sql语句如果包含中问题,提示“ Data too long for column '列名' at row 1”   或者在命令行中查询出的结果中,中文乱码   2.分析 ...

  9. ILSpy搜索功能加强版

    1.修改搜索功能,增加如下的额外搜索选项 A.按文本搜索(默认选项) B.按通配符搜索 C.按正则表达式搜索 2.搜索增加如下特性: A.可以按照名字空间检索特定名字空间下的所有类. B.修正了官方版 ...

  10. NSIS(001)检测和结束进程是否运行?

    配合插件:killer.dll 导入DLL:ReserveFile "${NSISDIR}\Plugins\killer.dll" 使用方法: ;可以检测和结束32位程序进程和64 ...