zoukankan      html  css  js  c++  java
  • 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是我们使用这些功能的前提和基础!

    回到目录

  • 相关阅读:
    phpMyAdmin cannot login to mysql server
    emulation 与 simulation 的区别
    C++类构造函数中的成员初始化
    KEY IDEA For Topology-based Analysis
    NOTES ON [Efficient and Cost-Effective Hybrid Congestion Control for HPC Interconnection Networks]
    Install Google Chrome On Ubuntu 14.04
    idea 远程debug调试
    癌细胞作用于身体
    应用高cpu高内存占用
    Jackson总结:常用注解、整合spring、自定义JsonSerializer
  • 原文地址:https://www.cnblogs.com/lori/p/5408151.html
Copyright © 2011-2022 走看看