回到目录

这个根据类型字符串动态去生产一个接口的对象,在实现项目中用途很广,这即省去了配置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. virtualbox下面安装ubuntu后外网如何远程ssh访问

    这两天在折腾virtualbox安装linux的事情,想多弄几个节点,装hadoop, 环境如下 两台thinkpad, 一台正常上班用的,win7 一台装的ubuntu kylin 16.04, 上 ...

  2. ASP.NET使用ConfigurationSection在Web.Config创建自定义配置节

    主要代码,一定要继续System.Configuration.ConfigurationSection,具体的节点名称可以自行修改 using System; using System.Data; u ...

  3. 如何将动态生成Word文件

    大致的思路是先用office2003或者2007编辑好Word的样式,然后另存为XML,将XML翻译为FreeMarker模板,最后用Java来解析FreeMarker模板并输出Doc.经测试这样方式 ...

  4. git 笔记

    查看某个提交的修改:git show commitID 查看某个提交修改涉及的文件:git show commitID --oneline --name-status 清理掉没有入库的文件,并把修改了 ...

  5. Jquery Mobile 学习笔记(一)

    1.模拟器,IOS:XCODE GENYMOTION  ANDROID:ECLIPSE GENYMOTION 2.jquery mobile data-role=page 代表一个页面 data-po ...

  6. Bootstrap的安装

    在了解了HTML和CSS.JS之后,我咨询了之前做过这一块的学长,得知了Bootstrap的存在. Bootstrap (Web前端CSS框架) Bootstrap,来自 Twitter,是目前很受欢 ...

  7. Web项目的发布新手教程

    ASP.NET服务器发布新手教程 ——本文仅赠予第一次做Web项目,需要发布的新手们,转载的请注明出处. 首先我们说一下我们的需要的一个环境.我使用的是Visual Studio 2010,版本.NE ...

  8. core的生成

    ubuntu12.04,默认无法生成core文件 输入ulimit -c 1024就ok了 列一下ulimit的参数,貌似这个命令是系统性能控制相关的,先不管了. 表 1. ulimit 参数说明 选 ...

  9. .NET环境下上传和下载Word文件

    一.上传Word文档或者其他文档 1.简单地上传文件的web服务方法如下 [WebMethod] public void UploadFile() { using (TransactionScope ...

  10. Erlang在Windows上开发环境搭建全过程讲解目录

    我会按照下面的列表来一步一步讲解,在windows来开发Erlang所用到的一些工具,和知识.我会不停的添加和修正. Erlang运行时环境 Erlang开发工具选择 Rebar来构建,编译,测试,发 ...