控制反转,即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定义:
<object name="EAS.Exam.DAL" assembly="EAS.Exam.DAL.SQLServer" type="EAS.Exam.DAL.SQLServer.DALManager" LifestyleType="Singleton" />
这样我们就完成了对IDALManager与具体实例化对象完成了结偶,当然上例只是一个很简单的例子,AgileEAS.NET中的IOC实现了构造注入和属性注入,以下配置示例:
<object name="MasterDbConnection" assembly="EAS.Data" type="EAS.Data.Access.OleDbConnection" LifestyleType="Singleton"> <property name="ConnectionString" type="string" value="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Password=sa;Initial Catalog=eas;Data Source=vm2003" /> object> <object name="OrmAccessor" assembly="EAS.Data" type="EAS.Data.ORM.OrmAccessor" LifestyleType="Singleton"> <property name="DbConnection" type="object" value="MasterDbConnection" /> object> <object name="CacheAccessor" assembly="EAS.Data" type="EAS.Data.ORM.CacheAccessor" LifestyleType="Singleton"> object> <object name="MasterDataAccessor" assembly="EAS.Data" type="EAS.Data.Access.OleDbAccessor" LifestyleType="Singleton"> <property name="Connection" type="object" value="MasterDbConnection" /> object> <object name="MasterRMIAccessor" assembly="EAS.Distributed.WebServiceClient" type="EAS.Distributed.WebServiceClient.RMIAccessor" LifestyleType="Singleton"> <constructor-arg index="0" type="string" value="http://demo.smarteas.net/activexform/Distributed/RMIService.asmx" /> object>
对于IOC容器中的对象生存方式定义如下:
/// <summary> /// 枚举LifestyleType 组件的生存方式,即组件以何种生存周期在容器中生存。 /// summary> public enum LifestyleType { /// <summary> /// Undefined,没有定义生存周期,即以默认生存周期(Transient)。 /// summary> Undefined = 0x00000000, /// <summary> /// Singleton,组件一旦自在,则在所有的客商端中共享。 /// summary> Singleton = 0x00000001, /// <summary> /// Thread,每一个客户端线程拥有单独的一个实例。 /// summary> Thread = 0x00000002, /// <summary> /// Transient,组件在使用时创建、使用后销毁。 /// summary> Transient = 0x00000004, /// <summary> /// Pooled,组件池,初始时分配一定数量的组件,客户请求时,分配一个空闲组件,用户使用完后交由池中。 /// summary> Pooled = 0x00000008 }
在使用中IOC提供了基于配置文件和程序配置两种方式进行对象配置,IOC容器使用组件容器IContainer和IOC上下文环境IContext提供服务,IContainer定义如下:
IContainer
IContext定义:
IContext
QQ群:120661978,125643764
链接:
AgileEAS.NET应用开发平台介绍
AgileEAS.NET之敏捷并行开发方法
敏捷软件工程实验室
©著作权归作者所有:来自51CTO博客作者agilelab的原创作品,如需转载,请注明出处,否则将追究法律责任
设计模式 IOC 中间件
AgileEAS.NET
0
收藏
上一篇:AgileEAS.NET平台之O... 下一篇:AgileEAS.NET平台之智...
推荐专栏更多
猜你喜欢
我的友情链接 分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载 搭建ELK日志分析平台(上)—— ELK介绍及搭建 Elasticsearch 分布式集群 使用Prometheus+grafana打造高逼格监控平台 用Kibana和logstash快速搭建实时日志查询、收集与分析系统 思科路由交换部分命令大全。 数据库设计(一)——数据库设计 搭建ELK日志分析平台(下)—— 搭建kibana和logstash服务器 spring boot + mybatis + layui + shiro后台权限管理系统 Android开发学习笔记:浅谈WebView 发现大量的TIME_WAIT解决办法 Android开发学习笔记:Intent的简介以及属性的详解 一次有趣的Linux下.Net Core与C语言的合作开发体验:生成Linux标准的用户密码串 ASPNetCore MVC ModelValidation-ajax C#如何设置Excel文档保护——工作簿、工作表、单元格 在.NET数据库访问方面的Dapper类库介绍 C#/VB.NET 如何添加、获取、删除PDF附件 C#/VB.NET 创建PDF项目符号列表和多级编号列表 C# /VB.NET 操作Word (一)——插入、修改、删除Word批注 C# 操作Excel数据透视表
Ctrl+Enter 发布
发布
取消