上篇文章介绍了如何利用反射类查找网站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. JavaScript简易教程

    这是我所知道的最完整最简洁的JavaScript基础教程. 这篇文章带你尽快走进JavaScript的世界——前提是你有一些编程经验的话.本文试图描述这门语言的最小子集.我给这个子集起名叫做“Java ...

  2. 我的git笔记

    转眼间加入git的阵营已经快两年了,结识git,缘起github,2年前在寻找代码托管网站,当时还是用svn,起初使用google code,可是google的服务虽好,在天朝你懂得,后来发现了git ...

  3. c# 上传图片流,php端(laravel框架)接收处理方法

    c# httppost方法 public struct PostFile { public string name; public string filename; public Stream bit ...

  4. Java 注释类之常用元注解

    Java 注释类之常用元注解 自定义Java注释类时,我们使用方式如下:   @Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD ...

  5. How determine the RC time constant in PWM DAC low-pass filter?

    how determine the RC time constant in PWM digital to analog low-pass filter? I 'm looking for the be ...

  6. hdu4607Park Visit 树的直径

    //给一棵双向树,数中边的权值为1,问对于这颗树中走k个节点的最短路径 //假设k小于这颗数的直径加1,那么走k个节点就没有反复的路,假设大于 //那么大于的节点都须要走两遍 #include< ...

  7. tex---就是tex文件,这个地球人都知道,是文章所在的主要文件

    本demo中包括两个文件example.tex和myref.bib,用的时候參照改即可啦. example.tex:用的时候将'\'和后面文字中间的空格去掉 ----------------- \do ...

  8. vs2013修改书签(vs书签文件位置)

    visual studio 2013 的书签功能很好用,可以记录一些代码的位置:方便查阅: 不过当项目被他人修改过后,svn update 更新过后,书签的文件行号不变,但是已经不再是原来记录的哪一行 ...

  9. Netty重要概念介绍

    Netty重要概念介绍 Bootstrap Netty应用程序通过设置bootstrap(引导)类开始,该类提供了一个用于网络成配置的容器. 一种是用于客户端的Bootstrap 一种是用于服务端的S ...

  10. 用 Prettier 统一团队的代码风格~

    使用 prettier 自動調整 JavaScript 樣式 GFM 格式说明 为什么你不能缺少Linter(以及代码美化工具) 使用 prettier 自動調整 JavaScript 樣式 Reac ...