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#程度员真的这么懒呀!

哈哈!

回到目录

时间: 2024-10-10 21:40:20

Lind.DDD.IoC(大叔推荐)~在服务定位器中引入IoC容器~容器的适配器的相关文章

Lind.DDD.Manage项目核心技术分享

回到目录 关于Lind.DDD.Manager的培训与学习 讲解:张占岭 花名:仓储大叔 主要框架:Lind.DDD,Lind.DDD.Manager 关于Lind.DDD.Manager 由于数据模型,数据库初始化(Code.First自动升级数据库或者进行数据库版本的迁移)控制器,View视图,css,js等元素组件的一套标准的后台管理系统框架,可以直接应用到任何一个系统上,可以它将发布到Nuget上,以后安装和更新更加方便. 如何为你的项目安装Lind.DDD.Manager Lind在n

Lind.DDD.IoC依赖注入与面向方面的实现

回到目录 IoC是解耦的灵魂,很难想像一个框架中没有IoC会变成什么样子,Lind.DDD里的IoC是通过Unity实现的,由依赖注入(unity)和方法拦截组成(Interception),依赖注入可以通过事前定义好的实现方式去动态建立某个接口的实例,例如,在仓储接口IRepository里,你可以在配置文件中定义它由EF实现,也可以让它由Mongodb实现,而表现出来的结果就是数据的持久化方式的不同. 模块的结构 服务定位器ServiceLocator 服务定位器可以帮助我们在不引用程序集的

Lind.DDD.Repositories.EF层介绍

回到目录 Lind.DDD.Repositories.EF以下简称Repositories.EF,之所以把它从Lind.DDD中拿出来,完全出于可插拔的考虑,让大家都能休会到IoC的魅力,用到哪种方法持久化,就将那个DLL放到应用程序中,完全不需要把所有持久化方式耦合到一个项目里,这也是遵循了OCP的原则,对扩展是开放的,即你可以添加其它的持久化方式,在新的项目里:而不要在原有的项目中进行代码的修改. Repositories.EF做为数据持久化的一种方式,它直接继承了Lind.DDD.IRep

Lind.DDD.Aspects通过Plugins实现方法的动态拦截~Lind里的AOP

回到目录 .Net MVC之所以发展的如些之好,一个很重要原因就是它公开了一组AOP的过滤器,即使用这些过滤器可以方便的拦截controller里的action,并注入我们自己的代码逻辑,向全局的异常记录,用户授权,Url授权,操作行为记录等,这一大批Lind的基本组件都是实现MVC和API的过滤实现的,使用这些过滤让我们不用去像HttpModule和HttpHandler那样,还要在Config里配置注入点,让程序员在开发方式上感觉很舒服,维护成功很低! 本文主要内容点 Lind.DDD里的方

Lind.DDD.Messaging框架通讯组件介绍

回到目录 大家好,今天有时间来介绍一下Lind.DDD框架里的消息机制,消息发送这块一般的实现方法是将Email,SMS等集成到一个公用类库里,而本身Email和SMS没什么关系,它们也不会有什么接口约定,即你想实现某种消息的多态发送,不需要程序代码,基本不可能实现,而在Lind.DDD里面,大叔将它进行了抽象,消息有自己的统一接口,而对于email和sms只是一种实现而以,这样,就可以发挥面向对象的特性,在sms,email甚至是rtx上进行消息的灵活切换了,说到这样,您心动了吧! Lind.

Lind.DDD敏捷领域驱动框架~Lind.DDD各层介绍

回到目录 Lind.DDD项目主要面向敏捷,快速开发,领域驱动等,对于它的分层也是能合并的合并,比之前大叔的框架分层更粗糙一些,或者说更大胆一些,在开发人员使用上,可能会感觉更方便了,更益使用了,这就是大叔开发Lind.DDD框架的目的,让一切变得更简单... Lind.DDD层 主要是公用方法,组件,规约等,如日志组件(Logger),消息组件(Messaging),IOC,AOP,缓存(Caching),异常,请求/响应,用户授权(Authorization),安全校验,领域模型(Domai

Lind.DDD.API核心技术分享

回到目录 关于Lind.DDD框架里API框架的技术点说明 讲解:张占岭 花名:仓储大叔 主要框架:Lind.DDD 目录 关于Lind.DDD.Authorization 关于授权的原理 关于ApiValidateModelConfig 关于Lind.DDD.CacheConfigFile 如何为你的API项目注入授权模块 关于服务端收取过滤器ApiValiadateFilter 如何在客户端生产加密授权串 关于请求类与响应类 客户端如何做分页 关于Lind.DDD.Authorization

Lind.DDD.Events领域事件介绍

回到目录 闲话多说 领域事件大叔感觉是最不好讲的一篇文章,所以拖欠了很久,但最终还是在2015年年前(阴历)把这个知识点讲一下,事件这个东西早在C#1.0时代就有了,那时学起来也是一个费劲,什么是委托,哪个是事件,搞的大家是糊里糊涂,进入C#2.0时代后,大叔也买了一本书,对于delegate和event这两个知识点看了至少有20几遍,感觉稍微有点明白了,明白了其中的真谛和用意. 委托:方法的规范,方法的模板,可以代表一类方法的集合 事件:委托的实例,事件在使用之前需要为它赋值,当然赋的就是一个

关于Lind.DDD.Api客户端的使用与知识分享

回到目录 关于Lind.DDD.Api的使用与客户端的调用 作者:张占岭 花名:仓储大叔 框架:Lind.DDD,Lind.DDD.Api 目录 Api里注册全局校验特性 1 Api中设置全局的Cors跨域资源访问 2 Api直接返回Json,而不是Xml 2 Api中Controller的Get,Post,Put和Delete 3 Api中Controller几大方法重载要注意的 3 客户端如何调用Api 4 对ResponseMessage的结果按需返回 5 对ResponseMessage