博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - 对象控制反转
阅读量:6005 次
发布时间:2019-06-20

本文共 2907 字,大约阅读时间需要 9 分钟。

     控制反转,即IOC(Inversion of Control),也叫反转模式,也称依赖注入DI(Dependency Injection)模式,关于此概念的解释我在此文不做过讲说明。

     对于设计模式类的东西,我也没有认真系统的去研究过那X类N种设计模式,无论何种设计模式,都用于解决一个问题,那就是解决对象之间的耦合关系,即解耦。

     AgileEAS.NET在最初版本最不包含IOC容器,更多应用抽象工厂之类的设计模式,在这AgileEAS.NET大概第二个版本,加入了一个轻量级(微量级)的IOC容器,也许实现的并不优雅,在多年的应用中慢慢完善。

      以下我列举一个 AgileEAS.NET平台IOC容器的一个应用场景,在某个产品开发中,有的产品使用ORACLE数据库、有的客户使用SQLServer数据库,这就要求我们必须做到产品同时支持两种数据库,我们在开发中对数据DAL采用其他接口驱动的设计,即定义三个项目:DAL接口、DAL的SQLServer实现、DAL的ORACLE实现,假定三个项目名称为Exam.DAL.Interface、Exam.DAL.SQLServer、Exam.DAL.Oracle;我们在Exam.DAL.Interface中定义N个业务对象接口和一个管理这些业务对象接口的IDALManager接口:

public interface IDALManager    {        IIteminfo CreateIteminfo();        IIteminfoList CreateIteminfoList();        IProduct CreateProduct();        IProductList CreateProductList();    }
 
    我们在Exam.DAL.SQLServer、Exam.DAL.Oracle中分别实现业务接口和IDALManager接口:
public class DALManager : IDALManager    {         public IIteminfo CreateIteminfo()        {            return new Iteminfo();        }        public IIteminfoList CreateIteminfoList()        {            return new IteminfoList();        }        public IProduct CreateProduct()        {            return new Product();        }        public IProductList CreateProductList()        {            return new ProductList();        }
}

      我们力争在设计中使用接口驱动并且使用具体被调用者在运行期确认,当然在这样的应用场景中除了IOC容器之外可以用其他模式进行实现,我在此不做说明。

    我们在Exam.DAL.Interface增加一个公共类DALHelper并做如下定义:

public class DALHelper    {        public DALHelper()        {        }        public static IDALManager DALManager        {            get            {                return ContextHelper.GetContext().Container.GetComponentInstance("EAS.Exam.DAL") as IDALManager;            }        }    }

    修改系统配件文件中的IOC定义:

     这样我们就完成了对IDALManager与具体实例化对象完成了结偶,当然上例只是一个很简单的例子,AgileEAS.NET中的IOC实现了构造注入和属性注入,以下配置示例:

      

        对于IOC容器中的对象生存方式定义如下:

 

/// 	/// 枚举LifestyleType 组件的生存方式,即组件以何种生存周期在容器中生存。	/// 	public enum LifestyleType	{		/// 		/// Undefined,没有定义生存周期,即以默认生存周期(Transient)。		/// 		Undefined = 0x00000000,		/// 		/// Singleton,组件一旦自在,则在所有的客商端中共享。		/// 		Singleton = 0x00000001,		/// 		/// Thread,每一个客户端线程拥有单独的一个实例。		/// 		Thread = 0x00000002,		/// 		/// Transient,组件在使用时创建、使用后销毁。		/// 		Transient = 0x00000004,		/// 		/// Pooled,组件池,初始时分配一定数量的组件,客户请求时,分配一个空闲组件,用户使用完后交由池中。		/// 		Pooled = 0x00000008	}

在使用中IOC提供了基于配置文件和程序配置两种方式进行对象配置,IOC容器使用组件容器IContainer和IOC上下文环境IContext提供服务,IContainer定义如下:

IContainer

IContext定义:

IContext

 

  QQ群:15118502

链接:

作者: 
出处:关于作者:有13年的软件从业经历,专注于中小软件企业软件开发过程研究,通过在技术与管理帮助中小软件企业实现技术层面开源节流的目的。熟悉需求分析、企业架构、项目管理。现主要从事基于平台的技术咨询工作,主要服务于医疗卫生、铁路、电信、物流、物联网、制造、零售等行业。如有问题或建议,请多多赐教! 
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,可以通过 联系我,也可以加入QQ群:113723486、199463175、116773358、116773358、212867943、147168308、59827496、193486983、15118502和大家共同讨论,非常感谢。

    本文转自魏琼东博客园博客,原文链接:http://www.cnblogs.com/eastjade/archive/2010/07/03/1770613.html,如需转载请自行联系原作者

你可能感兴趣的文章
满足用户的即时需求,金融云的效率优先与生态开放
查看>>
命令行基础
查看>>
三栏布局(两边固定,中间自适应) 常用方案及演变过程
查看>>
Vue嵌套组件的生命周期
查看>>
PHP 加密
查看>>
10月前端面试题目汇总
查看>>
【JAVA】Srping和传统JDBC实现数据库操作
查看>>
Redux-状态管理器
查看>>
mui扩展插件mui.showLoading加载框
查看>>
leetcode 122 买卖股票的最佳时机 II
查看>>
阿里云ons队列监控api深度使用
查看>>
Vue 基础篇(三):Vue生命周期理解
查看>>
区块链技术开发:场外交易为什么必不可少?
查看>>
Maven使用之道(1)----本地Maven配置
查看>>
霍金警告人工智能危险性 称其若失控很难被阻止
查看>>
NodeJS简单爬虫
查看>>
小猿圈分享-主流浏览器图片反防盗链方法总结
查看>>
Vue双向绑定原理
查看>>
如何聪明地利用待办事项 APP 完成任务
查看>>
4年程序员十面阿里终拿下offer,评级P6
查看>>