IOC容器特性注入第四篇:容器初始化
IOC容器,就是把各种服务都注入到容器里,想要什么就去拿什么,不仅解决服务类和接口类的耦合度还可以提高性能方便管理。
这里封装一个接口类和一个实现类
1.IContainerManager接口
public interface IContainerManger : IDisposable {
//#region AddResolvingObserver
//void AddResolvingObserver(IResolvingObserver observer);
//#endregion
#region AddComponent
void 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 Resolve
T Resolve<T>(string key = "", params Parameter[] parameters) where T : class;
object Resolve(Type type, string key = "", params Parameter[] parameters);
#endregion
#region ResolveAll
T[] ResolveAll<T>(string key = "");
object[] ResolveAll(Type type, string key = "");
#endregion
#region TryResolve
T 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 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<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 AddComponentInstance
public 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 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<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 ResolveAll
public 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
#region
public 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 ResolveUnRegistered
public 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("构造方法没有发现需要依赖的字段");
}
#endregion
public void Dispose() {
if (this._container != null && !this._container.IsDisposed)
{
this._container.Dispose();
}
this._container = null;
}
}
这个类不仅实现了接口还继承Ninject官方类,是为了减少其它程序在做注入的时候减少对Ninject的依赖,有了这个类以后,未来的扩展程序集在注册组件时就不用引用Ninject,对它形成依赖。
下一篇:
IOC容器特性注入第五篇:查找(Attribute)特性注入
IOC容器特性注入第四篇:容器初始化的更多相关文章
- IOC容器特性注入第三篇:Attribute封装
Attribute(特性)=>就是对类,方法,字段的自定义属性的基类.可以利用Attribute对类,方法等进行自定义描述,方便区分. 既然如此,那我们就可以那些需要注入IOC容器和不需要注入I ...
- IOC容器特性注入第五篇:查找(Attribute)特性注入
前面几篇文章分别介绍:程序集反射查找,特性,容器,但它们之间贯穿起来,形成查找Attribute注入IOC容器,就得需要下面这个类帮忙: 1.DependencyAttributeRegistrato ...
- IOC容器特性注入第六篇:利用MVC注入点,把容器启动
这里是利用MVC三个注入点中的:IDependencyResolver 进行注入 在全局类中Global.asax代码如下: #region MVC Inject System.Web.Mvc.Dep ...
- IOC容器特性注入第七篇:请求上下文作用域
Ninject的对象作用域: Transient .InTransientScope() 每次调用创建新实例. Singleton .InSingletonScope() 单例,仅创建一个实例. Th ...
- IOC容器特性注入第一篇:程序集反射查找
学习kooboo的框架发现它的注入容器方法比较特别,同样是利用MVC的注入点,但它是查找网站下面bin所有的DLL利用反射查找特性找到对应的服务注入到容器. 这样的好处很简单:完全可以不用关心IOC容 ...
- IOC容器特性注入第二篇:初始引擎查找对应的IOC容器
上篇文章介绍了如何利用反射类查找网站bin文件夹下面所有DLL的程序集类,这篇文章将介绍如何初始化一个IOC容器引擎. 目前IOC容器有很多,如Ninject,Autofac等,每个容器的驱动都不一样 ...
- 我在项目中运用 IOC(依赖注入)--实战篇
上一篇<我在项目中运用 IOC(依赖注入)--入门篇>只是简单的使用 IOC.实际项目使用 IOC 的情景复杂多了,比如说,构造函数有多个参数,有多个类继承同一个接口... Unity都有 ...
- 控制反转IOC与依赖注入DI - 理论篇
学无止境,精益求精 十年河东十年河西,莫欺少年穷 昨天是五一小长假归来上班的第一天,身体疲劳,毫无工作热情.于是就看看新闻,喝喝茶,荒废了一天 也就在昨天,康美同事张晶童鞋让我学习下IOC的理论及实现 ...
- 我在项目中运用 IOC(依赖注入)--入门篇
之前就听同事说过依赖注入(dependency injection).控制反转(Inversion of Control).起初听的是一头雾水,试着在项目中运用了几次,总算明白了一些,抛砖引玉,与大家 ...
随机推荐
- Leaflet_扩展Leaflet:类(2017-10-26)
扩展教程:http://leafletjs.com/examples/extending/extending-1-classes.html 翻译 该教程介绍扩展Leaflet最常用的方式. 注意:本文 ...
- 添加 vip
两台机器:172.16.91.101 172.16.91.107 在91.101上增加虚拟ip,92网段的 ifconfig eth0:1 172.16.92.2 netmask 255.255.25 ...
- 预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)(转)
用VC++ 2008 编写C语言程序,编译出现错误: 预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反) 解决方法: 建工程时 建立空项目 或者在项目设置里关闭预编 ...
- 绘图 Painter转接口封装的方式
记录下思想 适用于业务逻辑相对单纯的一些画法,比如画背景(颜色,背景,边框等) 一个Draw方法中如果绘制比较复杂的话,就会导致代码混乱,而不灵活,每次需求更改就得重新画过,可重用性差. 以接 ...
- 如何在本地搭建一个Android应用crashing跟踪系统-ACRA
https://github.com/bboyfeiyu/android-tech-frontier/tree/master/others/%E5%A6%82%E4%BD%95%E5%9C%A8%E6 ...
- C# ConcurrentDictionary实现
ConcurrentDictionary的源码看了很多遍,今天抽点时间整理一下,它的实现比Dictionary要复杂很多,至于线程安全我觉得比较简单,用的是lock的思想.首先我们来看看它的源码. p ...
- Session.Abandon和Session.Clear的实现和区别
我在网上找了一个比较贴切的描述: Session.Clear()就是把Session对象中的所有项目都删除了,Session对象里面啥都没有.但是Session对象还保留.Session.Abando ...
- Android四大组件应用系列——使用BroadcastReceiver和Service实现倒计时
一.问题描述 Service组件可以实现在后台执行一些耗时任务,甚至可以在程序退出的情况下,让Service在后台继续保持运行状态.Service分本地服务和远程服务,Local地服务附在主进程上的m ...
- Java 基础【17】 异常与自定义异常
1.异常的分类 Throwable 是所有异常类的基类,它包括两个子类:Exception 和 Error. a. 错误 (Error) 错误是无法难通过程序来解决的,所以程序不应该抛出这种类型的对象 ...
- Jenkins常用插件
Generic Webhook Trigger Plugin触发器webhook用户触发构建 Deploy to container Plugin部署到tomcat Gradle Plugin Gra ...