IOC容器特性注入第四篇:容器初始化
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容器特性注入第四篇:容器初始化相关推荐
- IOC容器特性注入第六篇:利用MVC注入点,把容器启动
这里是利用MVC三个注入点中的:IDependencyResolver 进行注入 在全局类中Global.asax代码如下: #region MVC InjectSystem.Web.Mvc.Depe ...
- IOC容器特性注入第五篇:查找(Attribute)特性注入
前面几篇文章分别介绍:程序集反射查找,特性,容器,但它们之间贯穿起来,形成查找Attribute注入IOC容器,就得需要下面这个类帮忙: 1.DependencyAttributeRegistrato ...
- IOC容器特性注入第一篇:程序集反射查找
学习kooboo的框架发现它的注入容器方法比较特别,同样是利用MVC的注入点,但它是查找网站下面bin所有的DLL利用反射查找特性找到对应的服务注入到容器. 这样的好处很简单:完全可以不用关心IOC容 ...
- Spring IOC (DI) 依赖注入的四种方式
依赖注入的四种方式: set 注入 赋值,默认使用的是set() 方法,依赖注入底层是通过反射实现的 <bean id="student" class="cust. ...
- ASP.NET CORE 第四篇 依赖注入IoC学习 + AOP界面编程初探
原文作者:老张的哲学 更新 1.如果看不懂本文,或者比较困难,先别着急问问题,我单写了一个关于依赖注入的小Demo,可以下载看看,多思考思考注入的原理: https://github.com/anjo ...
- Spring→简介核心作用范围、框架、接口编程、IOC控制反转、单元测试、Bean容器、注入、作用域、生命周期、自动装配注入、自动扫描@注解
官网 https://spring.io/ 文档 https://spring.io/projects/spring-framework Spring框架 框架 接口 IOC控制反转 单元测试 Bea ...
- 深入理解Tomcat和Jetty源码之第四篇tomcat系统架构上:容器是如何设计的
今天来介绍一下Tomcat的容器机制: 1.Tomcat的四种容器 2.容器示意图 3.责任链模式介绍 4.Tomcat如何确定请求是哪个Wrapper处理的 5.Tomcat的Context和ser ...
- 【云原生】第四篇--Docker容器镜像介绍及应用
Docker容器镜像介绍及应用 一.Docker容器镜像操作 1.1 查看本地容器镜像 1.1.1 使用docker images命令查看 1.1.2 使用docker image命令查看 1.1.3 ...
- Docker容器回顾之运维篇
一.背景 接上一篇<Docker复习之部署篇>,本文继续对Docker之日常维护常用操作做回顾总结. 官方文档: https://docs.docker.com/engine/refere ...
最新文章
- 6个月达不到25.6万年薪AI工程师,进不了大厂全额退款
- centos 7 No package python-dev available
- 传送,条件加速 Learn Unreal Engine (with C++)
- POJ 1094 拓扑排序
- 戴尔修复已存在12年之久的驱动漏洞,影响数百万个人电脑
- 【抢购仅限1500册】2019年入门必备Linux系统自学书籍半价促销。
- Atitit 文档全文索引的索引种类 用于文本数据挖掘 搜索 数据分析 目录 1.1. Txt摘要索引。。	1 1.2. File placeholder 索引	1 1.3. Lucence索引	1
- 歌单音乐播放器php源码,thinkphp多风格网页音乐播放器源码
- 学术会议论文查重吗_会议论文查重吗
- halcon轮廓擦除_【Halcon】轮廓处理
- Django-Templates模板语法(二)
- 5G手机价格再创新低纪录,却不是小米!
- allegro ARTWORK设置笔记
- JS——日期的横杠、斜杠相互替换
- 第三方远程控制工具TeamViewer的安装和使用教程,可下载window版和linux版,windows使用虚拟机可以与linux之间通讯
- Spark系列之Spark在不同集群中的架构
- c语言冗余数据什么意思,冗余是什么意思_冗余解释和意思
- 知名站长工具服务商:爱站网突然关站
- P4844 LJJ爱数数
- 优势分析- 性格测试