基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - 对象控制反转

     控制反转,即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	/// <summary>
	/// 的组件容器,组件容器管理组件的生存,也是对外提供的一个接口。
	/// </summary>
    public interface IContainer : IDisposable
	{
		/// <summary>
		/// 根据组件组件key向容器注册组件实现。
		/// </summary>
		/// <param name="componentKey">组件key。</param>
		void AddComponent(string componentKey);

		/// <summary>
		/// 根据组件组件key及组件实现类型向容器注册组件实现。
		/// </summary>
		/// <param name="componentKey">组件key。</param>
		/// <param name="componentImplementation"></param>
		void AddComponent(string componentKey, Type componentImplementation);

		/// <summary>
		/// 根据组件key、接口类型及实现类型中注册组件实现。
		/// </summary>
		/// <param name="componentKey">组件key。</param>
		/// <param name="serviceType">组件接口类型。</param>
		/// <param name="componentImplementation">组件实现类型。</param>
		void AddComponent(string componentKey, Type serviceType, Type componentImplementation);

		/// <summary>
		/// 根据组件实现类型及组件接口类型向容器注册组件实现。
		/// </summary>
		/// <param name="componentKey">组件key。</param>
		/// <param name="componentImplementation">组件实现类型。</param>
		/// <param name="serviceType">组件接口类型。</param>
		/// <param name="lifestyleType"> 组件生命周期方式。</param>
		/// <param name="lifestyleParameters"> 组件生命周期相关参数,参数为一个字符串,其中由“:”分隔。</param>
		void AddComponent(string componentKey,Type serviceType,Type componentImplementation,Lifecycle.LifestyleType lifestyleType,string lifestyleParameters);

		/// <summary>
		/// 根据组件实现类型向容器注册组件实现。
		/// </summary>
		/// <param name="componentImplementation">组件实现类型。</param>
		void AddComponent(Type componentImplementation);

		/// <summary>
		/// 根据组件实现类型及组件接口类型向容器注册组件实现。
		/// </summary>
		/// <param name="componentImplementation">组件实现类型。</param>
		/// <param name="serviceType">组件接口类型。</param>
		void AddComponent(Type componentImplementation,Type serviceType);

		/// <summary>
		/// 根据组件实例向组件容器中注册组件。
		/// </summary>
		/// <param name="componentInstance">组件实例。</param>
		void AddComponentInstance(object componentInstance);

		/// <summary>
		/// 根据组件key及组件实现向组件容器中注册组件。
		/// </summary>
		/// <param name="componentKey">组件key。</param>
		/// <param name="componentInstance">组件实例。</param>
		void AddComponentInstance(string componentKey, object componentInstance);		

		/// <summary>
		/// 根据组件key、接口类型及组件实例向组件容器中注册组件实现。
		/// </summary>
		/// <param name="componentKey">组件key。</param>
		/// <param name="serviceType">组件接口类型。</param>
		/// <param name="componentInstance">组件实例。</param>
		void AddComponentInstance(string componentKey, Type serviceType, object componentInstance);

		/// <summary>
		/// 根据组件key、接口类型、组件实例及组件生存类型向组件容器中注册组件实现。
		/// </summary>
		/// <param name="componentKey">组件key。</param>
		/// <param name="serviceType">组件接口类型。</param>
		/// <param name="componentInstance">组件实例。</param>
		/// <param name="lifestyleType"> 组件生命周期方式。</param>
		/// <param name="lifestyleParameters"> 组件生命周期相关参数,参数为一个字符串,其中由“:”分隔。</param>
		void AddComponentInstance(string componentKey, Type serviceType, object componentInstance,Lifecycle.LifestyleType lifestyleType,string lifestyleParameters);

		/// <summary>
		/// 根据组件key从组件容器中移除组件实现。
		/// </summary>
		/// <param name="componentKey">组件key。</param>
		/// <returns></returns>
		void RemoveComponent(string componentKey);       

		/// <summary>
		/// 根据组件实例从组件容器中移除组件实现。
		/// </summary>
		/// <param name="componentInstance">组件实例。</param>
		/// <returns></returns>
		void RemoveComponent(object componentInstance);

        /// <summary>
        /// 根据组件key及组件实例从组件容器中移除组件实现。
        /// </summary>
        /// <param name="componentKey">组件key。</param>
        /// <param name="componentInstance">组件实例。</param>
        /// <returns></returns>
        void RemoveComponent(string componentKey, object componentInstance);

		/// <summary>
		/// 根据组件key判断组件容器是否含指定key的组件实例。
		/// </summary>
		/// <param name="componentKey">组件key。</param>
		/// <returns></returns>
		bool HasComponent(string componentKey );

		/// <summary>
		/// 根据组件实例判断组件容器是否含指定key的组件实例。
		/// </summary>
		/// <param name="componentInstance">组件实例。</param>
		/// <returns></returns>
		bool HasComponent(object componentInstance );

		/// <summary>
		/// 根据组件接口类型判断组件容器是否含指定key的组件实例。
		/// </summary>
		/// <param name="serviceType">组件接口类型。</param>
		/// <returns></returns>
		bool HasComponent( Type serviceType );

		/// <summary>
		/// 组件索引器,获取指定Key值的组件实例。
		/// </summary>
		object this[string key]
		{
			get;
		}

		/// <summary>
		/// 组件索引器,获取指定接口类型的组件实例。
		/// </summary>
		object this[Type key]
		{
			get;
		}

		/// <summary>
		/// 根据组件实例从组件容器中释放组件实例。
		/// </summary>
		/// <param name="componentInstance">组件实例。</param>
		void ReleaseComponent(object componentInstance );

		/// <summary>
		/// 根据组件Key从组件容器中释放组件实例。
		/// </summary>
		/// <param name="componentKey">组件Key。</param>
		void ReleaseComponent( string componentKey );

		/// <summary>
		/// 根据组件的key取得组件实例。
		/// </summary>
		/// <param name="componentKey">组件的key。</param>
		/// <returns>组件实例。</returns>
		object GetComponentInstance(string componentKey);

		/// <summary>
		/// 根据组件的类型取得组件实例。
		/// </summary>
		/// <param name="componentType">组件类型。</param>
		/// <returns>组件实例。</returns>
		object GetComponentInstance(Type componentType);

        /// <summary>
        /// 根据组件服务类型取得组件实例。
        /// </summary>
        /// <param name="serviceType">组件接口类型。</param>
        /// <returns>组件实例。</returns>
        object GetServiceComponentInstance(Type serviceType);

		/// <summary>
		/// 获取一个值,批示容器中所有的组件列表。
		/// </summary>
        IDictionary<string, object> ComponentInstances { get; }

		/// <summary>
		/// 根据组件类型取得组件实例列表。
		/// </summary>
		/// <param name="serviceType">组件接口类型。</param>
		/// <returns>组件实例列表。</returns>
		IList GetComponentInstances(Type serviceType);

		/// <summary>
		/// 获取一个值,该值批示组件容器中的所有组件适配器列表。
		/// </summary>
        IDictionary<string, IComponentAdapter> ComponentAdapters { get; }

		/// <summary>
		/// 根据组件key取得与组件相关的组件适配器。
		/// </summary>
		/// <param name="componentKey">组件的key。</param>
		/// <returns>指定组件的组件适配器。</returns>
		IComponentAdapter GetComponentAdapter(string componentKey);

		/// <summary>
		/// 根据组件类型取得与组件相关的组件适配器。
		/// </summary>
		/// <param name="componentType">组件类型。</param>
		/// <returns>指定组件类型的组件适配器。</returns>
		IComponentAdapter GetComponentAdapter(Type componentType);

		/// <summary>
		/// 根据组件类类型获取组件适配器列表。
		/// </summary>
		/// <param name="serviceType">组件接口类型。</param>
		/// <returns>指定组件类型的组件适配器列表。</returns>
        IDictionary<string, IComponentAdapter> GetComponentAdapters(Type serviceType);

		/// <summary>
		/// 获取一个值,该值批示组件容器中的所有组件生命周期管理器列表。
		/// </summary>
        IDictionary<string, ILifecycleManager> LifecycleManagers { get;}

		/// <summary>
		/// 根据组件key取得与组件相关的组件生命周期管理器。
		/// </summary>
		/// <param name="componentKey"> 组件的键。</param>
		/// <returns>指定组件键的生命周期管理器。</returns>
		Lifecycle.ILifecycleManager GetLifecycleManager(string componentKey);

		/// <summary>
		/// 根据组件实现类型取得与组件相关的组件生命周期管理器。
		/// </summary>
		/// <param name="componentType"> 组件的实现类型。</param>
		/// <returns>指定组件类型的生命周期管理器。</returns>
		Lifecycle.ILifecycleManager GetLifecycleManager(System.Type componentType);

		/// <summary>
		/// 根据组件接口类型取得与组件相关的组件生命周期管理器列表。
		/// </summary>
		/// <param name="serviceType"> 组件的接口类型。</param>
		/// <returns>指定组件类型的生命周期管理器。</returns>
        IDictionary<string, ILifecycleManager> GetLifecycleManagers(System.Type serviceType);

	}

IContext定义:

IContext	public interface IContext
	{
		/// <summary>
		/// 组件容器,获取系统上下文中的组件容器。
		/// </summary>
		EAS.Objects.IContainer Container { get;}

		/// <summary>
		/// 判定指定名称的组件是生存周期是否为Singleton模式。
		/// </summary>
		/// <param name="name">组件的名称。</param>
		/// <returns>组件的生存周期是否为Singleton模式,是则返回true,否则返回false。</returns>
		bool IsSingleton(string name);

		/// <summary>
		/// 根据组件名称获取指定组件的生命周期类型。
		/// </summary>
		/// <param name="name">组件的名称。</param>
		/// <returns>组件的生命周期类型。</returns>
		Objects.Lifecycle.LifestyleType GetLifestyleType(string name);

		/// <summary>
		/// 上下文中是否包含指定名称的组件实例。
		/// </summary>
		/// <param name="name">组件的名称。</param>
		/// <returns>是否包含特定的组件。包含则返回true,否则返回false。</returns>
		bool ContainsObject(string name);

		/// <summary>
		/// 上下文中是否包含指定类型的组件实例。
		/// </summary>
		/// <param name="type">组件接口类型。</param>
		/// <returns>是否包含特定的组件。包含则返回true,否则返回false。</returns>
		bool ContainsObject(System.Type type);

		/// <summary>
		/// 索引器,根据名称获取指定的组件实例。
		/// </summary>
		object this[string name] { get; }

		/// <summary>
		/// 根据组件的名称返回一个组件实例。
		/// </summary>
		/// <param name="name">组件的名称。</param>
		/// <returns>组件的实例。</returns>
		object GetObject(string name);

		/// <summary>
		/// 根据组件的类型返回一个组件实例。
		/// </summary>
		/// <param name="type">组件的类型。</param>
		/// <returns>组件的实例。</returns>
		object GetObject(System.Type type);

		/// <summary>
		/// 根据组件的名称返回组件实例的类型。
		/// </summary>
		/// <param name="name">组件名称。</param>
		/// <returns>组件类型。</returns>
		Type GetType(string name);

		/// <summary>
		/// 在容器中配置组件。
		/// </summary>
		/// <param name="target">要配置的组件目标对象。</param>
		void ConfigureObject(object target);

		/// <summary>
		/// 在容器中配置组件。
		/// </summary>
		/// <param name="name">组件名称。</param>
		void ConfigureObject(string name);

		/// <summary>
		/// 在容器中配置组件。
		/// </summary>
		/// <param name="target">要配置的组件目标对象。</param>
		/// <param name="name">组件名称。</param>
		void ConfigureObject(object target, string name);

		/// <summary>
		/// 在容器中配置组件。
		/// </summary>
		/// <param name="type">组件类型。</param>
		void ConfigureObject(System.Type type);

		/// <summary>
		/// 在容器中配置组件。
		/// </summary>
		/// <param name="type">组件类型</param>
		/// <param name="name">组件名称。</param>
		void ConfigureObject(System.Type type,string name);
	}

 

  QQ群:15118502

链接:AgileEAS.NET应用开发平台介绍

AgileEAS.NET之敏捷并行开发方法

敏捷软件工程实验室

时间: 2024-10-26 15:25:11

基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - 对象控制反转的相关文章

基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - 文章汇总及学习指南

一.AgileEAS.NET平台简介 AgileEAS.NET平台是一套应用系统快速开发平台,用于帮助中小软件开发商快速构建自己的企业信息管理类开发团队,以达到节省开发成本.缩短开发时间,快速适应市场变化的目的,AgileEAS.NET应用开发平台包含基础类库.资源管理平台.运行容器.开发辅助工具等四大部分,资源管理平台为敏捷并行开发提供了设计.实现.测试等开发过程的并行. AgileEAS.NET平台基于软件过程改进以及构件化快速开发两方面达到这方面的目标,在软件过程改进实践方面,提出了独有的

基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - 5.0 简介

AgileEAS.NET简介  AgileEAS.NET平台(简称EAS.NET平台)是以"敏捷并行开发方法"为其过程指导思想.基于Microsoft .Net构件技术和模型驱动架构的企业级快速开发平台,AgileEAS.NET使的构建企业级分布式应用系统变得简单,它提供了可灵活扩展应用架构,并且革命性的改变了软件的生产方式,用于帮助中小型软件企业建立一条适合快速变化的开发团队,以达到节省开发成本.缩短开发时间,快速适应市场变化的目的. AgileEAS.NET介绍 AgileEAS.

基于DotNet构件技术的企业级敏捷软件开发平台 AgileEAS.NET 4.0 简介

介绍       AgileEAS.NET应用开发平台,简称EAS.NET,是基于敏捷并行开发思想以及.NET构件技术而开发的一个应用系统快速开发平台,用于帮助中小型软件企业建立一条适合快速变化的开发团队,以达到节省开发成本.缩短开发时间,快速适应市场变化的目的,AgileEAS.NET应用开发平台包含基础类库.资源管理平台.运行容器.开发辅助工具等四大部分,资源管理平台为敏捷并行开发提供了设计.实现.测试等开发过程的并行,基于AgileEAS.NET平台的应用系统的各个业务功能子系统,在系统体

基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - 关于AgileEAS.NET的一些补充说明

       首先,关于支持.NET Framework 版本问题;AgileEAS.NET最初是基于.net1.1的,目前网上能看到的基于早期版本的只有租吧二手房交易软件和售楼软件,之后2007年开始转移到net2.0版本,到目前为止,基于.net2.0,或许有人说,是否可以考虑基于.net3.5,.net4.0,这个就目前情况来说,还是基于.net2.0,因为对于企业管理信息系统来讲.net2.0足够了,我所熟悉的很多.net应用都是基于2.0版本,当然在以后我会根据需要增加.net4.0版

基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - 系列目录

      AgileEAS.NET应用开发平台最博客园最早的一篇介绍是2010年4月19号发的,随后也陆续发布了一些相关的介绍和应用的文章,最近差不多也一个多用不写了,主要原因是想着平台发布之后再继续写.       AgileEAS.NET平台定在本月内发布,到时间我会发布完整的开发包,包含所有程序集,类库参考手册,开发指南及相关文档,完整的开发例子,初次发布的管理和运行环境支持SQLServer/2000/2005/2008/oracle10/11数据库支持.       本文的主要目的是

基于DotNet构件技术的企业级敏捷软件开发平台 AgileEAS.NET - 敏捷并行开发方法

      首先声明,此并行开发非指并行计算,而是指实践软件工程所总结的一些心得和做法.       敏捷并行开发方法,是利用软件构件技术等技术,以及平台+插件化开发技术整合而出的一种快速开发模式:并行是指产品在生命周期内,项目管理过程.项目研发过程和机构支撑过程"并行"开展,项目研发过程中各个阶段有限度"并行"开展. 并行开发       在传统的瀑布开发模式下,同一软件的多个阶段是顺序地被开发出来的,也就是说第一阶段全部开发结束后才开始第二阶段的开发:同样,等第

基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - 4.0 最新发布版本 -下载使用说明

一.AgileEAS.NET发布包内容界面 在前些时间,我们对AgileEAS.NET平台平台进行了一次重构,进程序集进行了合并和裁剪,也发布一个基于新版AgileEAS.NET平台的SAAS结构的案例-AgileEAS.NET平台开发实例-药店系统-快速的SAAS开发体验,但一直没有向大家提供最新版本的下载和详细的介绍. AgileEAS.NET平台是一套应用系统快速开发平台,用于帮助中小软件开发商快速构建自己的企业信息管理类开发团队,以达到节省开发成本.缩短开发时间,快速适应市场变化的目的,

基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - ORM设计器

      AgileEAS.NET平台做为一个快速应用开发平台,其目的为是为了提高应用软件的生产效率,如何软件开发的生产效率,方法是多种多样的:使用工作简化开发中低技术重复工作可以是一种行之有效的途径.       在AgileEAS.NET平台中,我们提供了一个集数据库设计.代码生成.DDL定义与一体的数据实体设计器:       在早期的AgileEAS.NET版本中包含一个代码生成器,用于根据现在数据库生成ORM代码,后来的思路是想介入项目的数据库设计环节,所以设计了这么一个数据对象设计

基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - 账户与角色

      前面的文章我介绍了AgileEAS.NET平台关于模块插件的集成,本文我介绍AgileEAS.NET平台中的一个重要功能,账户和角色.       做为一个企业级应用开发平台,我们应该包括账户管理,做为一个插件集成平台,我们应该包括模块插件的权限管理,而权限系统,也必须依赖于插件和系统使用者(也就是账户和角色).       AgileEAS.NET参考了Windows系统的用户管理机制,Windows设置了用户和用户组,用户组是用户的组合,主要用于权限的设定,AgileEAS.NE