如何实现一个IOC容器,举例说明IoC容器的实现方式有哪些

  如何实现一个IOC容器,举例说明IoC容器的实现方式有哪些

  IService接口,以实现服务的启动、停止功能:

  使用系统;

  使用系统。集合。泛型;

  使用系统100 . Linq

  使用系统。文本;

  使用系统。线程。任务;

  命名空间实用程序

  {

  ///摘要

  ///服务接口

  ////摘要

  公共接口服务

  {

  ///摘要

  ///服务启动

  ////摘要

  void OnStart();

  ///摘要

  ///服务停止

  ////摘要

  stop()上的void

  }

  }查看代码

  抽象服务服务抽象类:

  使用系统;

  使用系统。集合。泛型;

  使用系统100 . Linq

  使用系统。文本;

  使用系统。线程。任务;

  命名空间实用程序

  {

  ///摘要

  ///服务抽象类

  ////摘要

  公共抽象类抽象服务:IService

  {

  ///摘要

  ///服务启动

  ////摘要

  public virtual void OnStart() { }

  ///摘要

  ///服务停止

  ////摘要

  public virtual void OnStop() { }

  }

  }查看代码

  国际奥林匹克委员会容器帮助类:

  使用系统;

  使用系统。集合。并发;

  使用系统。集合。泛型;

  使用系统100 . Linq

  使用系统。反思;

  使用系统。线程。任务;

  使用系统网页。

  命名空间实用程序

  {

  ///摘要

  ///服务帮助类

  ////摘要

  公共分部类ServiceHelper

  {

  #地区变量

  ///摘要

  ///接口的对象集合

  ////摘要

  私有静态并发字典类型,object _dict=新的并发字典类型,对象

  #结束区域

  #区域获取获取实例

  ///摘要

  ///获取实例

  ////摘要

  公共静态T Get T()

  {

  type type=的类型(T);

  对象obj=_dict .GetOrAdd(type,key=Activator .创建实例(类型));

  返回obj

  }

  #结束区域

  #区域获取通过功能获取实例

  ///摘要

  ///获取实例

  ////摘要

  公共静态T Get T (Func T func)

  {

  type type=的类型(T);

  对象obj=_dict .GetOrAdd(type,(key)=func());

  返回obj

  }

  #结束区域

  #区域寄存器集合注册程序集

  ///摘要

  ///注册程序集

  ////摘要

  ///param name=type 程序集中的一个类型/param

  公共静态void RegisterAssembly(类型类型)

  {

  注册程序集(程序集GetAssembly(类型)。全名);

  }

  ///摘要

  ///注册程序集

  ////摘要

  ///param name=assemblyString 程序集名称的长格式/param

  公共静态void寄存器程序集(字符串程序集字符串)

  {

  log time util log time util=new log time util();

  装配装配=装配。加载(汇编字符串);

  Type[] typeArr=assembly .GetTypes();

  string iServiceInterfaceName=类型(IService).全名;

  foreach(类型数组中的类型类型)

  {

  Type typeIService=type .获取接口(iServiceInterfaceName);

  if (typeIService!=null!类型。是抽象的)

  {

  Type[] interfaceTypeArr=type .获取接口();

  对象obj=激活器CreateInstance(类型);

  _dict .GetOrAdd(type,obj);

  foreach(在interfaceTypeArr中键入接口类型)

  {

  if (interfaceType!=typeof(IService))

  {

  _dict .GetOrAdd(interfaceType,obj);

  }

  }

  }

  }

  logTimeUtil .LogTime(ServiceHelper .注册组件注册程序集程序集字符串耗时);

  }

  #结束区域

  #地区启动所有服务

  ///摘要

  ///启动所有服务

  ////摘要

  公共静态任务StartAllService()

  {

  返回任务。运行(()=

  {

  列表任务任务列表=新列表任务

  foreach (object o in _dict .价值观。Distinct()

  {

  任务任务=任务工厂。StartNew(obj=

  {

  IService service=obj as IService

  尝试

  {

  服务OnStart();

  罗格蒂尔。日志(服务obj .GetType()."全名"已启动);

  }

  接住(例外ex)

  {

  罗格蒂尔。错误(例如,服务obj .GetType()."全名"启动失败);

  }

  },o);

  任务列表。添加(任务);

  }

  任务WaitAll(任务列表ToArray());

  });

  }

  #结束区域

  #地区停止所有服务

  ///摘要

  ///停止所有服务

  ////摘要

  公共静态任务StopAllService()

  {

  返回任务。运行(()=

  {

  列表任务任务列表=新列表任务

  type iServiceInterfaceType=type of(IService);

  foreach (object o in _dict .价值观。Distinct()

  {

  任务任务=任务工厂。StartNew(obj=

  {

  if (iServiceInterfaceType .IsAssignableFrom(obj .GetType()))

  {

  IService service=obj as IService

  尝试

  {

  服务. OnStop();

  罗格蒂尔。日志(服务obj .GetType()."全名"已停止).wait();

  }

  接住(例外ex)

  {

  罗格蒂尔。错误(例如,服务obj .GetType()."全名"停止失败).wait();

  }

  }

  },o);

  任务列表。添加(任务);

  }

  任务WaitAll(任务列表ToArray());

  });

  }

  #结束区域

  }

  }查看代码

  说明:

  注册组件方法:注册实现类,只要程序集中的类实现了某个接口,就注册,把它的类型以及接口的类型作为钥匙添加到字典中,以接口类型作为钥匙的时候,过滤掉IService这个接口。

  StartAllService方法:调用所有服务的开始方法。

  StopAllService方法:调用所有服务的OnStop方法。

  如何使用:

  服务的注册与启动:

  ServiceHelper .注册程序集(我的操作筛选器的类型);

  ServiceHelper .StartAllService().wait();查看代码

  说明:注册程序集方法的参数,传递程序集中任何一个类型即可。

  服务的停止:

  ServiceHelper .StopAllService().wait();查看代码

  服务的定义:

  使用模型;

  使用牛顿软件公司.数据

  使用NetWebApi .木豆

  使用系统;

  使用系统。集合。泛型;

  使用系统。木卫一;

  使用系统100 . Linq

  使用系统。网;

  使用系统。反思;

  使用系统。文本;

  使用系统。穿线;

  使用系统。线程。任务;

  使用系统。计时器;

  使用系统网页。

  使用系统。集合。并发;

  使用实用工具

  使用系统。配置;

  命名空间NetWebApi .基地址定位连接

  {

  ///摘要

  ///通用

  ////摘要

  公共类CommonBll : AbstractService

  {

  #区域开始服务启动

  ///摘要

  ///服务启动

  ////摘要

  公共覆盖void OnStart()

  {

  }

  #结束区域

  #区域停止服务停止

  ///摘要

  ///服务停止

  ////摘要

  公共重写void OnStop()

  {

  }

  #结束区域

  }

  }查看代码

  调用服务:

  公共bll公共bll=服务助手.获取公共视图代码

  临时注册并调用服务:

  SaveDataBll m _ SaveDataBll=服务助手.获取savedataball视图代码

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • office2010激活密钥大全 怎么永久激活office2010
  • project2010产品密钥免费_project2010激活密钥永久激活码
  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • chatgpt是什么?为什么这么火?
  • ChatGPT为什么注册不了?OpenAI ChatGPT的账号哪里可以注册?
  • OpenAI ChatGPT怎么注册账号?ChatGPT账号注册教程
  • chatgpt什么意思,什么是ChatGPT ?
  • CAD中怎么复制图形标注尺寸不变,CAD中怎么复制图形线性不变
  • cad中怎么创建并使用脚本文件,cad怎么运行脚本
  • cad中快速计算器的功能,cad怎么快速计算
  • cad中快速修改单位的方法有哪些,cad中快速修改单位的方法是
  • cad中心点画椭圆怎么做,cad轴测图怎么画椭圆
  • CAD中常用的快捷键,cad各种快捷键的用法
  • 留言与评论(共有 条评论)
       
    验证码: