IOC容器,就是把各种服务都注入到容器里,想要什么就去拿什么,不仅解决服务类和接口类的耦合度还可以提高性能方便管理。

这里封装一个接口类和一个实现类

1.IContainerManager接口

    public interface IContainerManger : IDisposable {//#region AddResolvingObserver//void AddResolvingObserver(IResolvingObserver observer);//#endregion#region AddComponentvoid AddComponent<TService>(string key = "", ComponentLifeStyle lifeStyle = ComponentLifeStyle.Singleton);void AddComponent(Type type, string key = "", ComponentLifeStyle liftStyle = ComponentLifeStyle.Singleton);void AddComponent<TService, TImplementation>(string key = "",ComponentLifeStyle liftStyle = ComponentLifeStyle.Singleton);void AddComponent(Type service, Type implementation, string key = "",ComponentLifeStyle liftStyle = ComponentLifeStyle.Singleton, params  Parameter[] parameters);void AddComponentInstance<TService>(object instance, string key = "");void AddComponentInstance(object instance, string key = "");void AddComponentInstance(Type service, object instance, string key = "");#endregion#region ResolveT Resolve<T>(string key = "", params Parameter[] parameters) where T : class;object Resolve(Type type, string key = "", params Parameter[] parameters);#endregion#region ResolveAllT[] ResolveAll<T>(string key = "");object[] ResolveAll(Type type, string key = "");#endregion#region TryResolveT TryResolve<T>(string key = "", params Parameter[] parameters);object TryResolve(Type type, string key = "", params Parameter[] parameters);#endregion#region ResolveUnRgeistered(未注册) T ResolveUnregistered<T>() where T : class;object ResolveUnregistered(Type type);#endregion}

也是一样,实例版本和泛型版本都写了,方便使用 

2. ContainerManager实现类

    public class ContainerManager : StandardKernel, IContainerManger {#region Fieldsprivate IKernel _container;#endregion#region .ctorpublic ContainerManager() {_container = new StandardKernel();_container.Settings.Set("InjectAttribute", typeof(DaHua.Common.Runtime.Dependency.InjectAttribute));}#endregion#region Propertiespublic IKernel Container {get {return _container;}}#endregion#region AddComponentpublic void AddComponent<TService>(string key = "", ComponentLifeStyle lifeStyle = ComponentLifeStyle.Singleton) {AddComponent(typeof(TService), typeof(TService), key, lifeStyle);}public void AddComponent(Type type, string key = "", ComponentLifeStyle liftStyle = ComponentLifeStyle.Singleton) {AddComponent(type, type, key, liftStyle);}public void AddComponent<TService, TImplementation>(string key = "", ComponentLifeStyle liftStyle = ComponentLifeStyle.Singleton) {AddComponent(typeof(TService), typeof(TImplementation), key, liftStyle);}public void AddComponent(Type service, Type implementation, string key = "", ComponentLifeStyle liftStyle = ComponentLifeStyle.Singleton, params  Parameter[] parameters) {var binding = _container.Bind(service).To(implementation);if (parameters != null) {var ninjectParameter = ConvertParameters(parameters);foreach (var parameter in ninjectParameter) {binding.WithParameter(parameter);}}binding.PerLifeStyle(liftStyle).MapKey(key).ReplaceExsting(service);}#endregion#region AddComponentInstancepublic void AddComponentInstance<TService>(object instance, string key = "") {AddComponentInstance(typeof(TService), instance, key);}public void AddComponentInstance(object instance, string key = "") {AddComponentInstance(instance.GetType(), instance, key);}public void AddComponentInstance(Type service, object instance, string key = "") {_container.Bind(service).ToConstant(instance).MapKey(key).ReplaceExsting(service);}#endregion#region ConvertParametersprivate static NinjectParameters.IParameter[] ConvertParameters(Parameter[] parameters) {if (parameters == null) {return null;}returnparameters.Select(it => new NinjectParameters.ConstructorArgument(it.Name, (context) => it.valueCallback())).ToArray();}#endregion#region Resolvepublic virtual T Resolve<T>(string key = "", params Parameter[] parameters) where T : class {if (string.IsNullOrWhiteSpace(key)) {return _container.Get<T>(ConvertParameters(parameters));}return _container.Get<T>(key, ConvertParameters(parameters));}public virtual object Resolve(Type type, string key = "", params Common.Runtime.Parameter[] parameters) {if (string.IsNullOrWhiteSpace(key)){return _container.Get(type, ConvertParameters(parameters));}return _container.Get(type, key, ConvertParameters(parameters));}#endregion#region ResolveAllpublic virtual T[] ResolveAll<T>(string key = "") {if (string.IsNullOrWhiteSpace(key)){return _container.GetAll<T>().ToArray();}return _container.GetAll<T>(key).ToArray();}public virtual object[] ResolveAll(Type type, string key = "") {if (string.IsNullOrWhiteSpace(key)){return _container.GetAll(type).ToArray();}return _container.GetAll(type, key).ToArray();}#endregion#regionpublic virtual T TryResolve<T>(string key = "", params Common.Runtime.Parameter[] parameters) {if (string.IsNullOrWhiteSpace(key)){return _container.TryGet<T>(ConvertParameters(parameters));}return _container.TryGet<T>(key, ConvertParameters(parameters));}public virtual object TryResolve(Type type, string key = "", params Common.Runtime.Parameter[] parameters) {if (string.IsNullOrWhiteSpace(key)){return _container.TryGet(type, ConvertParameters(parameters));}return _container.TryGet(type, key, ConvertParameters(parameters));}#endregion#region ResolveUnRegisteredpublic T ResolveUnregistered<T>() where T : class{return ResolveUnregistered(typeof (T)) as T;}public object ResolveUnregistered(Type type){var constructors = type.GetConstructors();foreach (var constructor in constructors){var parameters = constructor.GetParameters();var parameterInstances = new List<object>();foreach (var parameter in parameters){var service = Resolve(parameter.ParameterType);if(service==null)parameterInstances.Add(service);}return Activator.CreateInstance(type, parameterInstances.ToArray());}throw new Exception("构造方法没有发现需要依赖的字段");}#endregionpublic void Dispose() {if (this._container != null && !this._container.IsDisposed){this._container.Dispose();}this._container = null;}}

这个类不仅实现了接口还继承Ninject官方类,是为了减少其它程序在做注入的时候减少对Ninject的依赖,有了这个类以后,未来的扩展程序集在注册组件时就不用引用Ninject,对它形成依赖。

下一篇:

IOC容器特性注入第五篇:查找(Attribute)特性注入

转载于:https://www.cnblogs.com/flyfish2012/p/3781754.html

IOC容器特性注入第四篇:容器初始化相关推荐

  1. IOC容器特性注入第六篇:利用MVC注入点,把容器启动

    这里是利用MVC三个注入点中的:IDependencyResolver 进行注入 在全局类中Global.asax代码如下: #region MVC InjectSystem.Web.Mvc.Depe ...

  2. IOC容器特性注入第五篇:查找(Attribute)特性注入

    前面几篇文章分别介绍:程序集反射查找,特性,容器,但它们之间贯穿起来,形成查找Attribute注入IOC容器,就得需要下面这个类帮忙: 1.DependencyAttributeRegistrato ...

  3. IOC容器特性注入第一篇:程序集反射查找

    学习kooboo的框架发现它的注入容器方法比较特别,同样是利用MVC的注入点,但它是查找网站下面bin所有的DLL利用反射查找特性找到对应的服务注入到容器. 这样的好处很简单:完全可以不用关心IOC容 ...

  4. Spring IOC (DI) 依赖注入的四种方式

    依赖注入的四种方式: set 注入 赋值,默认使用的是set() 方法,依赖注入底层是通过反射实现的 <bean id="student" class="cust. ...

  5. ASP.NET CORE 第四篇 依赖注入IoC学习 + AOP界面编程初探

    原文作者:老张的哲学 更新 1.如果看不懂本文,或者比较困难,先别着急问问题,我单写了一个关于依赖注入的小Demo,可以下载看看,多思考思考注入的原理: https://github.com/anjo ...

  6. Spring→简介核心作用范围、框架、接口编程、IOC控制反转、单元测试、Bean容器、注入、作用域、生命周期、自动装配注入、自动扫描@注解

    官网 https://spring.io/ 文档 https://spring.io/projects/spring-framework Spring框架 框架 接口 IOC控制反转 单元测试 Bea ...

  7. 深入理解Tomcat和Jetty源码之第四篇tomcat系统架构上:容器是如何设计的

    今天来介绍一下Tomcat的容器机制: 1.Tomcat的四种容器 2.容器示意图 3.责任链模式介绍 4.Tomcat如何确定请求是哪个Wrapper处理的 5.Tomcat的Context和ser ...

  8. 【云原生】第四篇--Docker容器镜像介绍及应用

    Docker容器镜像介绍及应用 一.Docker容器镜像操作 1.1 查看本地容器镜像 1.1.1 使用docker images命令查看 1.1.2 使用docker image命令查看 1.1.3 ...

  9. Docker容器回顾之运维篇

    一.背景 接上一篇<Docker复习之部署篇>,本文继续对Docker之日常维护常用操作做回顾总结. 官方文档: https://docs.docker.com/engine/refere ...

最新文章

  1. 6个月达不到25.6万年薪AI工程师,进不了大厂全额退款
  2. centos 7 No package python-dev available
  3. 传送,条件加速 Learn Unreal Engine (with C++)
  4. POJ 1094 拓扑排序
  5. 戴尔修复已存在12年之久的驱动漏洞,影响数百万个人电脑
  6. 【抢购仅限1500册】2019年入门必备Linux系统自学书籍半价促销。
  7. Atitit 文档全文索引的索引种类 用于文本数据挖掘 搜索 数据分析 目录 1.1. Txt摘要索引。。 1 1.2. File placeholder 索引 1 1.3. Lucence索引 1
  8. 歌单音乐播放器php源码,thinkphp多风格网页音乐播放器源码
  9. 学术会议论文查重吗_会议论文查重吗
  10. halcon轮廓擦除_【Halcon】轮廓处理
  11. Django-Templates模板语法(二)
  12. 5G手机价格再创新低纪录,却不是小米!
  13. allegro ARTWORK设置笔记
  14. JS——日期的横杠、斜杠相互替换
  15. 第三方远程控制工具TeamViewer的安装和使用教程,可下载window版和linux版,windows使用虚拟机可以与linux之间通讯
  16. Spark系列之Spark在不同集群中的架构
  17. c语言冗余数据什么意思,冗余是什么意思_冗余解释和意思
  18. 知名站长工具服务商:爱站网突然关站
  19. P4844 LJJ爱数数
  20. 优势分析- 性格测试

热门文章

  1. Flutter fvm 多版本管理
  2. Android 帧动画 xml 方式实现
  3. Android应用程序管理系列(二)——PackageManager 包管理者
  4. Android--使用LayoutInflater加载布局文件的三种方法
  5. P1120-小木棍 [数据加强版]
  6. MySQL 视图的基础操作(五)
  7. [唐诗]正月十五日夜-苏味道
  8. IIS7 配置 PHP
  9. 写在开通博客的第一天
  10. Linux内核(1)--从开机到main函数