Lind.DDD.IoC(大叔推荐)~在服务定位器中引入IoC容器~容器的适配器
关于依赖倒置(DIP)
高层模块不依赖于低层模块的实现,而低层模块依赖于高层模块定义的接口,通俗的讲,就是高层模块定义接口,低层模块负责实现,这在我们实际开发中经常被用到,层与层之间引用,经常被添加一个接口层去隔离,在接口层定义相关业务规范,而底层去实现它,高层只引用这个接口,当高级需要其它扩展,直接添加新的接口,由新的底层模块去实现即可,底层其它代码不需要修改,这也完全复合开闭原则(OCP).
关于控制反转(IOC)
控制反转是一种设计模式,像单例,工厂,适合器都属于设计模式的一种,它是依赖倒置原则的具体实现,它告诉我们应该如何做,来解除相互依赖模块的耦合.
关于依赖注入(DI)
是IOC的一种实现方式,我们经常说的构造方法注入,属性注入,接口注入,指的就是DI,而我们经过说的unity,autofac,castle指的是DI的框架,即我们的IOC容器!
关于Lind.DDD.IoC容器
对于Lind.DDD.IoC模块来说,主要实现的功能是IoC和AoP,它在整个框架中都起到了底层支持的作用,如你的仓储在生产时,需要用到IoC;你的业务模块根据一个规则实现了多种策略,在生产这个业务模块时,需要用到IoC容器,而这个IoC容器可以通过服务定位器很方便找到你的依赖关系,坦白的说,对于所有对象的生产,都离不开服务定位器.
关于服务定位器(ServiceLocator)
一个程序集依赖别一个程序集,我们的服务定位器将帮助我们在Bin目录查找对应的依赖关系,帮我们生产对象;Lind.DDD里的服务定位器依赖了Lind的IocContainer,而新的IOC容器如果希望被服务定位器使用,我们只要实现IocContainer即可,这对于程序的扩展性是有好处的,目前Lind.IoC只集成了unity和autofac两种IoC容器.
关于Lind框架的IContainer
对所有第三方IoC容器的抽象,它只实现了最一般的IoC方法,如注入,反转,是否被注入等,具体看一下代码
/// <summary> /// IoC容器规范 /// 作者:仓储大叔 /// </summary> public interface IContainer { /// <summary> /// 反射成对象 /// </summary> /// <typeparam name="TService">接口类型</typeparam> /// <returns>具体类型</returns> TService Resolve<TService>(); /// <summary> /// 反射成对象 /// </summary> /// <typeparam name="TService">接口类型</typeparam> /// <returns>具体类型</returns> object Resolve(Type type); /// <summary> /// 反射成对象 /// </summary> /// <typeparam name="TService">接口类型</typeparam> /// <param name="overridedArguments">参数</param> /// <returns>具体类型</returns> TService Resolve<TService>(object overridedArguments); /// <summary> /// 反射成对象 /// </summary> /// <typeparam name="TService">接口类型</typeparam> /// <param name="overridedArguments">参数</param> /// <returns>具体类型</returns> object Resolve(Type serviceType, object overridedArguments); /// <summary> /// 注册抽象类型与具体实现的类型 /// </summary> /// <param name="from">接口类型</param> /// <param name="to">具体类型</param> void RegisterType(Type from, Type to); /// <summary> /// 类型是否被注册到IoC容器 /// </summary> /// <param name="type"></param> /// <returns></returns> bool IsRegistered(Type type); }
关于适配器模式
对于多种IoC容器的统一,我们借用了适配器模式,新添加了适配器类去实现我们自己的IContainer接口,在实现时,事实上是对原来第三方容器的重写,这种模式虽然添加了额外的类对象,但实现了对现有功能的扩展.
关于框架级的工厂模式
工厂模式一般不去实现,在业务层直接使用ioc容器生产对象即可,你使用工厂模块,一般都会有对象的switch这种坏味道的块出现,但对于比较稳定的框架对象来说,使用工厂模式还是比较不错的选择,因为你的框架实现是比较固定的,所以可以使用switch来进行策略的控制,从而生产指定的对象,当然对于不满足条件的,我们也应该手动throw出来,告诉开发人员.
结束语
希望大家都去自己写C#的框架,而不是每次都依赖从java共享出来的框架,感觉味道怪怪的,难道C#程度员真的这么懒呀!
哈哈!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
2013-07-12 将不确定变为确定~DateTime.MinValue和MaxValue引发的异常
2012-07-12 爱上MVC3系列~使用@需要注意的地方
2011-07-12 不忘本~explicit和implicit修饰符
2011-07-12 MVC3+EF4.1开发之一
2011-07-12 EF架构~了解一下,ADO.NET Entity Framework