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是我们使用这些功能的前提和基础!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
2012-04-19 如何让你的系统配置文件更合理