当前位置: 首页 > news >正文

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!

有一点要注意一下,对不在本程序集里的类型,需要将程序集名称写清楚,如下

  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是我们使用这些功能的前提和基础!

转载于:https://www.cnblogs.com/tsql/p/10399311.html

相关文章:

  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • 什么是API网关 如何设计亿万级统一网关
  • React的组件模式
  • passportjs 源码分析
  • Google Play 下架 App 之后的替身制作
  • 安卓应用性能调试和优化经验分享
  • Redis 懒删除(lazy free)简史
  • vue全家桶+Koa2开发笔记(8)--开发网页
  • Mycat - 实现数据库的读写分离与高可用
  • 理解 JavaScript 中的 this
  • 块级、内联、内联块级
  • Spring Boot 运作原理
  • 虚拟机网络不通故障解决
  • 原型模式深入探讨-【设计模式4】
  • 撕掉普通程序员的标签,这才是真正的大数据工程师!
  • CAP理论的例子讲解
  • Date型的使用
  • echarts花样作死的坑
  • Java Agent 学习笔记
  • JavaScript 一些 DOM 的知识点
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • scala基础语法(二)
  • spring security oauth2 password授权模式
  • Wamp集成环境 添加PHP的新版本
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 基于组件的设计工作流与界面抽象
  • 聚簇索引和非聚簇索引
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • (12)Hive调优——count distinct去重优化
  • (C++17) std算法之执行策略 execution
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (十) 初识 Docker file
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .net下简单快捷的数值高低位切换
  • /dev/sda2 is mounted; will not make a filesystem here!
  • /etc/fstab 只读无法修改的解决办法
  • @RequestBody的使用
  • @RequestParam,@RequestBody和@PathVariable 区别
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [100天算法】-x 的平方根(day 61)
  • [23] 4K4D: Real-Time 4D View Synthesis at 4K Resolution
  • [AndroidStudio]_[初级]_[修改虚拟设备镜像文件的存放位置]
  • [Apio2012]dispatching 左偏树
  • [BZOJ2208][Jsoi2010]连通数
  • [C++]命名空间等——喵喵要吃C嘎嘎
  • [CF226E]Noble Knight's Path
  • [Cocoa]iOS 开发者账户,联机调试,发布应用事宜
  • [Editor]Unity Editor类常用方法
  • [iOS]GCD(一)