您的位置:首页 > 其它

AgileEAS.NET平台之对象控制反转

2011-05-08 22:34 204 查看
控制反转,即IOC(InversionofControl),也叫反转模式,也称依赖注入DI(DependencyInjection)模式,关于此概念的解释我在此文不做过讲说明。
对于设计模式类的东西,我也没有认真系统的去研究过那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接口:
publicinterfaceIDALManager
{
IIteminfoCreateIteminfo();
IIteminfoListCreateIteminfoList();
IProductCreateProduct();
IProductListCreateProductList();
}
我们在Exam.DAL.SQLServer、Exam.DAL.Oracle中分别实现业务接口和IDALManager接口:

publicclassDALManager:IDALManager
{
publicIIteminfoCreateIteminfo()
{
returnnewIteminfo();
}
publicIIteminfoListCreateIteminfoList()
{
returnnewIteminfoList();
}
publicIProductCreateProduct()
{
returnnewProduct();
}
publicIProductListCreateProductList()
{
returnnewProductList();
}
}


我们力争在设计中使用接口驱动并且使用具体被调用者在运行期确认,当然在这样的应用场景中除了IOC容器之外可以用其他模式进行实现,我在此不做说明。
我们在Exam.DAL.Interface增加一个公共类DALHelper并做如下定义:
publicclassDALHelper
{
publicDALHelper()
{
}
publicstaticIDALManagerDALManager
{
get
{
returnContextHelper.GetContext().Container.GetComponentInstance("EAS.Exam.DAL")asIDALManager;
}
}
}

修改系统配件文件中的IOC定义:
<objectname="EAS.Exam.DAL"assembly="EAS.Exam.DAL.SQLServer"type="EAS.Exam.DAL.SQLServer.DALManager"LifestyleType="Singleton"/>

这样我们就完成了对IDALManager与具体实例化对象完成了结偶,当然上例只是一个很简单的例子,AgileEAS.NET中的IOC实现了构造注入和属性注入,以下配置示例:
<objectname="MasterDbConnection"assembly="EAS.Data"type="EAS.Data.Access.OleDbConnection"LifestyleType="Singleton">
<propertyname="ConnectionString"type="string"value="Provider=SQLOLEDB.1;PersistSecurityInfo=False;UserID=sa;Password=sa;InitialCatalog=eas;DataSource=vm2003"/>
</object>
<objectname="OrmAccessor"assembly="EAS.Data"type="EAS.Data.ORM.OrmAccessor"LifestyleType="Singleton">
<propertyname="DbConnection"type="object"value="MasterDbConnection"/>
</object>
<objectname="CacheAccessor"assembly="EAS.Data"type="EAS.Data.ORM.CacheAccessor"LifestyleType="Singleton">
</object>
<objectname="MasterDataAccessor"assembly="EAS.Data"type="EAS.Data.Access.OleDbAccessor"LifestyleType="Singleton">
<propertyname="Connection"type="object"value="MasterDbConnection"/>
</object>
<objectname="MasterRMIAccessor"assembly="EAS.Distributed.WebServiceClient"type="EAS.Distributed.WebServiceClient.RMIAccessor"LifestyleType="Singleton">
<constructor-argindex="0"type="string"value="http://demo.smarteas.net/activexform/Distributed/RMIService.asmx"/>
</object>

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

	///<summary>
///枚举LifestyleType组件的生存方式,即组件以何种生存周期在容器中生存。
///</summary>
publicenumLifestyleType
{
///<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 ///<summary>
///的组件容器,组件容器管理组件的生存,也是对外提供的一个接口。
///</summary>
publicinterfaceIContainer:IDisposable
{
///<summary>
///根据组件组件key向容器注册组件实现。
///</summary>
///<paramname="componentKey">组件key。</param>
voidAddComponent(stringcomponentKey);
///<summary>
///根据组件组件key及组件实现类型向容器注册组件实现。
///</summary>
///<paramname="componentKey">组件key。</param>
///<paramname="componentImplementation"></param>
voidAddComponent(stringcomponentKey,TypecomponentImplementation);
///<summary>
///根据组件key、接口类型及实现类型中注册组件实现。
///</summary>
///<paramname="componentKey">组件key。</param>
///<paramname="serviceType">组件接口类型。</param>
///<paramname="componentImplementation">组件实现类型。</param>
voidAddComponent(stringcomponentKey,TypeserviceType,TypecomponentImplementation);
///<summary>
///根据组件实现类型及组件接口类型向容器注册组件实现。
///</summary>
///<paramname="componentKey">组件key。</param>
///<paramname="componentImplementation">组件实现类型。</param>
///<paramname="serviceType">组件接口类型。</param>
///<paramname="lifestyleType">组件生命周期方式。</param>
///<paramname="lifestyleParameters">组件生命周期相关参数,参数为一个字符串,其中由“:”分隔。</param>
voidAddComponent(stringcomponentKey,TypeserviceType,TypecomponentImplementation,Lifecycle.LifestyleTypelifestyleType,stringlifestyleParameters);

///<summary>
///根据组件实现类型向容器注册组件实现。
///</summary>
///<paramname="componentImplementation">组件实现类型。</param>
voidAddComponent(TypecomponentImplementation);

///<summary>
///根据组件实现类型及组件接口类型向容器注册组件实现。
///</summary>
///<paramname="componentImplementation">组件实现类型。</param>
///<paramname="serviceType">组件接口类型。</param>
voidAddComponent(TypecomponentImplementation,TypeserviceType);
///<summary>
///根据组件实例向组件容器中注册组件。
///</summary>
///<paramname="componentInstance">组件实例。</param>
voidAddComponentInstance(objectcomponentInstance);

///<summary>
///根据组件key及组件实现向组件容器中注册组件。
///</summary>
///<paramname="componentKey">组件key。</param>
///<paramname="componentInstance">组件实例。</param>
voidAddComponentInstance(stringcomponentKey,objectcomponentInstance);
///<summary>
///根据组件key、接口类型及组件实例向组件容器中注册组件实现。
///</summary>
///<paramname="componentKey">组件key。</param>
///<paramname="serviceType">组件接口类型。</param>
///<paramname="componentInstance">组件实例。</param>
voidAddComponentInstance(stringcomponentKey,TypeserviceType,objectcomponentInstance);
///<summary>
///根据组件key、接口类型、组件实例及组件生存类型向组件容器中注册组件实现。
///</summary>
///<paramname="componentKey">组件key。</param>
///<paramname="serviceType">组件接口类型。</param>
///<paramname="componentInstance">组件实例。</param>
///<paramname="lifestyleType">组件生命周期方式。</param>
///<paramname="lifestyleParameters">组件生命周期相关参数,参数为一个字符串,其中由“:”分隔。</param>
voidAddComponentInstance(stringcomponentKey,TypeserviceType,objectcomponentInstance,Lifecycle.LifestyleTypelifestyleType,stringlifestyleParameters);
///<summary>
///根据组件key从组件容器中移除组件实现。
///</summary>
///<paramname="componentKey">组件key。</param>
///<returns></returns>
voidRemoveComponent(stringcomponentKey);
///<summary>
///根据组件实例从组件容器中移除组件实现。
///</summary>
///<paramname="componentInstance">组件实例。</param>
///<returns></returns>
voidRemoveComponent(objectcomponentInstance);
///<summary>
///根据组件key及组件实例从组件容器中移除组件实现。
///</summary>
///<paramname="componentKey">组件key。</param>
///<paramname="componentInstance">组件实例。</param>
///<returns></returns>
voidRemoveComponent(stringcomponentKey,objectcomponentInstance);
///<summary>
///根据组件key判断组件容器是否含指定key的组件实例。
///</summary>
///<paramname="componentKey">组件key。</param>
///<returns></returns>
boolHasComponent(stringcomponentKey);
///<summary>
///根据组件实例判断组件容器是否含指定key的组件实例。
///</summary>
///<paramname="componentInstance">组件实例。</param>
///<returns></returns>
boolHasComponent(objectcomponentInstance);
///<summary>
///根据组件接口类型判断组件容器是否含指定key的组件实例。
///</summary>
///<paramname="serviceType">组件接口类型。</param>
///<returns></returns>
boolHasComponent(TypeserviceType);
///<summary>
///组件索引器,获取指定Key值的组件实例。
///</summary>
objectthis[stringkey]
{
get;
}
///<summary>
///组件索引器,获取指定接口类型的组件实例。
///</summary>
objectthis[Typekey]
{
get;
}
///<summary>
///根据组件实例从组件容器中释放组件实例。
///</summary>
///<paramname="componentInstance">组件实例。</param>
voidReleaseComponent(objectcomponentInstance);
///<summary>
///根据组件Key从组件容器中释放组件实例。
///</summary>
///<paramname="componentKey">组件Key。</param>
voidReleaseComponent(stringcomponentKey);
///<summary>
///根据组件的key取得组件实例。
///</summary>
///<paramname="componentKey">组件的key。</param>
///<returns>组件实例。</returns>
objectGetComponentInstance(stringcomponentKey);
///<summary>
///根据组件的类型取得组件实例。
///</summary>
///<paramname="componentType">组件类型。</param>
///<returns>组件实例。</returns>
objectGetComponentInstance(TypecomponentType);
///<summary>
///根据组件服务类型取得组件实例。
///</summary>
///<paramname="serviceType">组件接口类型。</param>
///<returns>组件实例。</returns>
objectGetServiceComponentInstance(TypeserviceType);
///<summary>
///获取一个值,批示容器中所有的组件列表。
///</summary>
IDictionary<string,object>ComponentInstances{get;}

///<summary>
///根据组件类型取得组件实例列表。
///</summary>
///<paramname="serviceType">组件接口类型。</param>
///<returns>组件实例列表。</returns>
IListGetComponentInstances(TypeserviceType);

///<summary>
///获取一个值,该值批示组件容器中的所有组件适配器列表。
///</summary>
IDictionary<string,IComponentAdapter>ComponentAdapters{get;}
///<summary>
///根据组件key取得与组件相关的组件适配器。
///</summary>
///<paramname="componentKey">组件的key。</param>
///<returns>指定组件的组件适配器。</returns>
IComponentAdapterGetComponentAdapter(stringcomponentKey);
///<summary>
///根据组件类型取得与组件相关的组件适配器。
///</summary>
///<paramname="componentType">组件类型。</param>
///<returns>指定组件类型的组件适配器。</returns>
IComponentAdapterGetComponentAdapter(TypecomponentType);
///<summary>
///根据组件类类型获取组件适配器列表。
///</summary>
///<paramname="serviceType">组件接口类型。</param>
///<returns>指定组件类型的组件适配器列表。</returns>
IDictionary<string,IComponentAdapter>GetComponentAdapters(TypeserviceType);
///<summary>
///获取一个值,该值批示组件容器中的所有组件生命周期管理器列表。
///</summary>
IDictionary<string,ILifecycleManager>LifecycleManagers{get;}

///<summary>
///根据组件key取得与组件相关的组件生命周期管理器。
///</summary>
///<paramname="componentKey">组件的键。</param>
///<returns>指定组件键的生命周期管理器。</returns>
Lifecycle.ILifecycleManagerGetLifecycleManager(stringcomponentKey);
///<summary>
///根据组件实现类型取得与组件相关的组件生命周期管理器。
///</summary>
///<paramname="componentType">组件的实现类型。</param>
///<returns>指定组件类型的生命周期管理器。</returns>
Lifecycle.ILifecycleManagerGetLifecycleManager(System.TypecomponentType);
///<summary>
///根据组件接口类型取得与组件相关的组件生命周期管理器列表。
///</summary>
///<paramname="serviceType">组件的接口类型。</param>
///<returns>指定组件类型的生命周期管理器。</returns>
IDictionary<string,ILifecycleManager>GetLifecycleManagers(System.TypeserviceType);
}


IContext定义:




IContext publicinterfaceIContext
{
///<summary>
///组件容器,获取系统上下文中的组件容器。
///</summary>
EAS.Objects.IContainerContainer{get;}
///<summary>
///判定指定名称的组件是生存周期是否为Singleton模式。
///</summary>
///<paramname="name">组件的名称。</param>
///<returns>组件的生存周期是否为Singleton模式,是则返回true,否则返回false。</returns>
boolIsSingleton(stringname);
///<summary>
///根据组件名称获取指定组件的生命周期类型。
///</summary>
///<paramname="name">组件的名称。</param>
///<returns>组件的生命周期类型。</returns>
Objects.Lifecycle.LifestyleTypeGetLifestyleType(stringname);
///<summary>
///上下文中是否包含指定名称的组件实例。
///</summary>
///<paramname="name">组件的名称。</param>
///<returns>是否包含特定的组件。包含则返回true,否则返回false。</returns>
boolContainsObject(stringname);

///<summary>
///上下文中是否包含指定类型的组件实例。
///</summary>
///<paramname="type">组件接口类型。</param>
///<returns>是否包含特定的组件。包含则返回true,否则返回false。</returns>
boolContainsObject(System.Typetype);
///<summary>
///索引器,根据名称获取指定的组件实例。
///</summary>
objectthis[stringname]{get;}
///<summary>
///根据组件的名称返回一个组件实例。
///</summary>
///<paramname="name">组件的名称。</param>
///<returns>组件的实例。</returns>
objectGetObject(stringname);
///<summary>
///根据组件的类型返回一个组件实例。
///</summary>
///<paramname="type">组件的类型。</param>
///<returns>组件的实例。</returns>
objectGetObject(System.Typetype);
///<summary>
///根据组件的名称返回组件实例的类型。
///</summary>
///<paramname="name">组件名称。</param>
///<returns>组件类型。</returns>
TypeGetType(stringname);
///<summary>
///在容器中配置组件。
///</summary>
///<paramname="target">要配置的组件目标对象。</param>
voidConfigureObject(objecttarget);
///<summary>
///在容器中配置组件。
///</summary>
///<paramname="name">组件名称。</param>
voidConfigureObject(stringname);
///<summary>
///在容器中配置组件。
///</summary>
///<paramname="target">要配置的组件目标对象。</param>
///<paramname="name">组件名称。</param>
voidConfigureObject(objecttarget,stringname);
///<summary>
///在容器中配置组件。
///</summary>
///<paramname="type">组件类型。</param>
voidConfigureObject(System.Typetype);
///<summary>
///在容器中配置组件。
///</summary>
///<paramname="type">组件类型</param>
///<paramname="name">组件名称。</param>
voidConfigureObject(System.Typetype,stringname);
}


QQ群:120661978,125643764
链接:AgileEAS.NET应用开发平台介绍
AgileEAS.NET之敏捷并行开发方法
敏捷软件工程实验室
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐