上篇文章介绍了如何利用反射类查找网站bin文件夹下面所有DLL的程序集类,这篇文章将介绍如何初始化一个IOC容器引擎。

目前IOC容器有很多,如Ninject,Autofac等,每个容器的驱动都不一样,为了方便驱动解耦,好使用不同的IOC容器,就得有一个公共接口。

1. IEngine (引擎接口)

    public interface IEngine {
//#region Initialize //void Initialize(); //#endregion #region ContainerManager
IContainerManger ContainerManager { get; }
#endregion #region Resolve T Resolve<T>(params Parameter[] parameters) where T : class;
T Resolve<T>(string name, params Parameter[] parameters) where T : class;
object Resolve(Type type, params Parameter[] parameters);
object Resolve(Type type, string name, params Parameter[] parameters); #endregion #region TryResolve T TryResolve<T>(params Parameter[] parameters) where T : class;
T TryResolve<T>(string name, params Parameter[] parameters) where T : class;
object TryResolve(Type type, params Parameter[] parameters);
object TryResolve(Type type, string name, params Parameter[] parameters); #endregion #region ResolveAll IEnumerable<Object> ResolveAll(Type serviceType);
IEnumerable<T> ResolveAll<T>(); #endregion
}

接口主要约束:解析,试图解析,解析所有三个方法,都采用实例和泛型两个版本来写。PS:泛型就是实例的约束版而已,但线程是安全的。

2.EngineContext(引擎上下文)

    public class EngineContext {
#region Initializtion Methods
/// <summary>
/// 确保方法同步实例化
/// </summary>
/// <param name="forceRecreate"></param>
/// <returns></returns>
[MethodImpl(MethodImplOptions.Synchronized)]
public static IEngine Initialize(bool forceRecreate)
{
if (Singleton<IEngine>.Instance == null || forceRecreate)
{
Singleton<IEngine>.Instance = CreateEngineInstance();
//Singleton<IEngine>.Instance.Initialize();
}
return Singleton<IEngine>.Instance;
}
#endregion public static IEngine CreateEngineInstance()
{
var typeFinder = new WebAppTypeFinder();
var engines = typeFinder.FindClassesOfType<IEngine>().ToArray();
if (engines.Length > )
{
var defaultEngine =(IEngine)Activator.CreateInstance(engines[]);
return defaultEngine;
}
else
{
throw new ApplicationException("找不到IOC容器");
}
} public static IEngine Current
{
get
{
if (Singleton<IEngine>.Instance == null)
{
Initialize(false);
}
return Singleton<IEngine>.Instance;
}
}
}

引擎上下文:为了保证系统线程当中可以高性能的使用容器驱动,又是唯一的实例,所以使用单例类进行托管

3.Singleton(单列类)

/// <summary>
/// 单列模式保持唯一性 提高性能
/// </summary>
public class Singleton
{
/// <summary>
/// 字典数组
/// </summary>
private static readonly IDictionary<Type, object> allSingletons; static Singleton()
{
allSingletons=new Dictionary<Type, object>();
} public static IDictionary<Type, object> AllSingletons
{
get
{
return allSingletons;
}
}
}
/// <summary>
/// 单列泛型模式
/// </summary>
/// <typeparam name="T"></typeparam>
public class Singleton<T> : Singleton
{
private static T _instance; public static T Instance
{
get
{
return _instance;
}
set
{
_instance = value;
AllSingletons[typeof (T)] = value;
}
}
} /// <summary>
/// 单列泛型数组模式
/// </summary>
/// <typeparam name="T"></typeparam>
public class SingletonList<T> : Singleton<IList<T>>
{
static SingletonList()
{
Singleton<IList<T>>.Instance=new List<T>();
} public new static IList<T> Instance
{
get
{
return Singleton<IList<T>>.Instance;
}
}
} /// <summary>
/// 单列字典模式
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <typeparam name="TValue"></typeparam>
public class SingletonDictionary<TKey, TValue> : Singleton<IDictionary<TKey, TValue>>
{
static SingletonDictionary()
{
Singleton<Dictionary<TKey,TValue>>.Instance=new Dictionary<TKey, TValue>();
} public new static IDictionary<TKey, TValue> Instance
{
get
{
return Singleton<Dictionary<TKey, TValue>>.Instance;
}
}
}

单例类:防止重复创建实例。

上面主要是容器接口,上下文等封装,要使用具体的IOC那就得继承IEngine这个接口。

这里使用的是Ninject接口类:

4.NinjectEngine(实现IEngine接口)

public class NinjectEngine:IEngine {

        #region Properties

        public IContainerManger ContainerManager
{
get;
private set;
} public ITypeFinder TypeFinder
{
get;
private set;
}
#endregion #region .ctor public NinjectEngine(ITypeFinder typeFinder):this(typeFinder,new ContainerManager())
{}
public NinjectEngine(ITypeFinder typeFinder, ContainerManager containerManager)
{
if (typeFinder == null)
{
throw new ArgumentException("没有反射类查找器");
}
this.TypeFinder = typeFinder;
this.ContainerManager = containerManager;
InitializeContainer();
}
#endregion #region Methods private void InitializeContainer() {
var attrDependency = new DependencyAttributeRegistrator(this.TypeFinder, this.ContainerManager);
attrDependency.RegisterServices();
} public T Resolve<T>(params Parameter[] parameters) where T : class
{
return ContainerManager.Resolve<T>(null, parameters);
} public T Resolve<T>(string name, params Parameter[] parameters) where T : class
{
return ContainerManager.Resolve<T>(name, parameters);
} public object Resolve(Type type, params Parameter[] parameters)
{
return ContainerManager.Resolve(type, null, parameters);
} public object Resolve(Type type, string name, params Parameter[] parameters) {
return ContainerManager.Resolve(type, name, parameters);
} public T TryResolve<T>(params Parameter[] parameters) where T : class
{
return ContainerManager.TryResolve<T>(null, parameters);
} public T TryResolve<T>(string name, params Parameter[] parameters) where T : class
{
return ContainerManager.TryResolve<T>(name, parameters);
} public object TryResolve(Type type, params Parameter[] parameters)
{
return ContainerManager.TryResolve(type, null, parameters);
} public object TryResolve(Type type, string name, params Parameter[] parameters)
{
return ContainerManager.TryResolve(type, name, parameters);
} public IEnumerable<object> ResolveAll(Type serviceType)
{
return ContainerManager.ResolveAll(serviceType);
} public IEnumerable<T> ResolveAll<T>()
{
return ContainerManager.ResolveAll<T>();
} #endregion
}

引擎初始化大致过程是这样的。接口=>程序集查找=>实现接口的IOC容器类=>写入单列=>形成容器驱动上下文

下一篇:

IOC容器特性注入第三篇:Attribute封装

IOC容器特性注入第二篇:初始引擎查找对应的IOC容器的更多相关文章

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

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

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

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

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

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

  4. IOC容器特性注入第三篇:Attribute封装

    Attribute(特性)=>就是对类,方法,字段的自定义属性的基类.可以利用Attribute对类,方法等进行自定义描述,方便区分. 既然如此,那我们就可以那些需要注入IOC容器和不需要注入I ...

  5. IOC容器特性注入第四篇:容器初始化

    IOC容器,就是把各种服务都注入到容器里,想要什么就去拿什么,不仅解决服务类和接口类的耦合度还可以提高性能方便管理. 这里封装一个接口类和一个实现类 1.IContainerManager接口 pub ...

  6. IOC容器特性注入第七篇:请求上下文作用域

    Ninject的对象作用域: Transient .InTransientScope() 每次调用创建新实例. Singleton .InSingletonScope() 单例,仅创建一个实例. Th ...

  7. Ioc容器依赖注入-Spring 源码系列(2)

    Ioc容器依赖注入-Spring 源码系列(2) 目录: Ioc容器beanDefinition-Spring 源码(1) Ioc容器依赖注入-Spring 源码(2) Ioc容器BeanPostPr ...

  8. Java EE中的容器和注入分析,历史与未来

    Java EE中的容器和注入分析,历史与未来 java中的容器 java中的注入 容器和注入的历史和展望 一.java中的容器 java EE中的注入,使我们定义的对象能够获取对资源和其他依赖项的引用 ...

  9. SSM框架之Spring(2)IOC及依赖注入

    Spring(2)IOC及依赖注入 基于xml配置文件的实现 1.IOC (控制反转-Inversion Of Control) 控制反转(Inversion of Control,缩写为IoC),是 ...

随机推荐

  1. C#高级编程9 第16章 错误和异常

    C#高级编程9 第16章 错误和异常 了解这章可以学会如何处理系统异常以及错误信息. System.Exception类是.NET运行库抛出的异常,可以继承它定义自己的异常类. try块代码包含的代码 ...

  2. emSecure Use Digital Signatures to protect your products

    emSecure Use Digital Signatures to protect your products emSecure is an RSA based software solution ...

  3. c++ try catch 问题

    以前都是用try{} catch(…){}来捕获C++中一些意想不到的异常, 今天看了Winhack的帖子才知道,这种方法在VC中其实是靠不住的.例如下面的代码: 以前都是用try{} catch(… ...

  4. arcgis pro行列转换

    行转列 列转行

  5. docker使用大全 tomcat安装

    um install docker #安装docker docker search tomcat docker pull docker.io/tomcat # 安装tomcat镜像 docker im ...

  6. shell命令行执行python(解析json)

    每个脚本都有自己的擅长. 有次实现一个work,使用了shell,php,python看着文件种类多,不方便交接,看着也比较麻烦. 减少文件种类数,也是很有必要的. 遇到的场景:shell程序需要从j ...

  7. Andorid源码 4.4 TAG

    Fetching project platform/frameworks/opt/timezonepickerremote: Counting objects: 11169, doneremote: ...

  8. “正在注册字体”问题解决

    在win7下安装老软件,卡在"正在注册字体"了,检查发现是ocx注册有问题. 重写一个ocx注册的批处理就好了. 如: regsvr32 "C:\Program File ...

  9. 【Little Demo】左右按钮tab选项卡双切换

    通过前一篇文章 从简单的Tab标签到Tab图片切换 的说明,相关效果也就可以实现了. 1.左右按钮tab选项卡双切换 很明显,左右两个按钮是 absolute 布局,另外就是内容部分和Tab标签部分. ...

  10. JAVA通过oshi获取系统和硬件信息

    一.引入jar包 本项目主要使用第开源jar包:https://github.com/oshi/oshi <dependency> <groupId>junit</gro ...