博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IOC容器特性注入第四篇:容器初始化
阅读量:4650 次
发布时间:2019-06-09

本文共 7192 字,大约阅读时间需要 23 分钟。

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

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

1.IContainerManager接口

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

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

 

2. ContainerManager实现类

public class ContainerManager : StandardKernel, IContainerManger {        #region Fields        private IKernel _container;        #endregion        #region .ctor        public ContainerManager() {            _container = new StandardKernel();            _container.Settings.Set("InjectAttribute", typeof(DaHua.Common.Runtime.Dependency.InjectAttribute));        }        #endregion        #region Properties        public IKernel Container {            get {                return _container;            }        }        #endregion        #region AddComponent        public void AddComponent
(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
(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 AddComponentInstance public void AddComponentInstance
(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 ConvertParameters private static NinjectParameters.IParameter[] ConvertParameters(Parameter[] parameters) { if (parameters == null) { return null; } return parameters.Select(it => new NinjectParameters.ConstructorArgument(it.Name, (context) => it.valueCallback())) .ToArray(); } #endregion #region Resolve public virtual T Resolve
(string key = "", params Parameter[] parameters) where T : class { if (string.IsNullOrWhiteSpace(key)) { return _container.Get
(ConvertParameters(parameters)); } return _container.Get
(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 ResolveAll public virtual T[] ResolveAll
(string key = "") { if (string.IsNullOrWhiteSpace(key)) { return _container.GetAll
().ToArray(); } return _container.GetAll
(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 #region public virtual T TryResolve
(string key = "", params Common.Runtime.Parameter[] parameters) { if (string.IsNullOrWhiteSpace(key)) { return _container.TryGet
(ConvertParameters(parameters)); } return _container.TryGet
(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 ResolveUnRegistered public T ResolveUnregistered
() 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
(); 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("构造方法没有发现需要依赖的字段"); } #endregion public void Dispose() { if (this._container != null && !this._container.IsDisposed) { this._container.Dispose(); } this._container = null; } }

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

下一篇:

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

你可能感兴趣的文章
UVa 四叉树
查看>>
hihoCoder 1116 计算(线段树)
查看>>
支付平台架构
查看>>
客户端下载文件和服务器端下载文件总结
查看>>
批处理定时打开一个网页
查看>>
EBGAN
查看>>
第一天 python入门 基础 “”“Hello World”和if-elif的使用、数据类型
查看>>
think python chapter3
查看>>
源码安装MySQL
查看>>
第八周进度条博客
查看>>
软工项目项目介绍,任务分配--拍桌子版
查看>>
Liferay7 BPM门户开发之27: MVC Portlet插件工程开发
查看>>
麦软社区Mindmanager现金抵用券使用流程
查看>>
教你一些Linux中隐藏bash历史命令的小技巧
查看>>
jquery、datetimepicker插件中的change事件
查看>>
C++ 随机生成一个(0,1)之间的小数
查看>>
java http post json
查看>>
关于"斐波那契数列"你能做到哪一步?
查看>>
安装Ubuntu时的硬盘分区方案 转载
查看>>
kafka使用实例
查看>>