如何实现一个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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。