本节目录

DI介绍

控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题.

依赖注入(Dependency Injection,英文缩写为DI)是一种设计模式.

其实本质都是指同一件事,强调的内容不一样.IoC强调容器的作用,DI强调注入的作用.

通常IoC和DI可以理解为一个意思,只是指的对象不同.

DI基本原理

DI本质上是通过容器来反射创建实例.

1个简单的类

    class Person
{
public void Say()
{
Console.WriteLine("Person's say method is Called");
}
}

反射代码(className:类的全限定名)

        private static object CreateInstance(Assembly assembly, string className)
{
var type = assembly.GetType(className);
return type != null ? Activator.CreateInstance(type) : null;
}

执行(XX为命名空间)

        static void Main(string[] args)
{
var obj = CreateInstance(Assembly.GetExecutingAssembly(), "XX.Person");
var person = obj as Person;
if (person != null)
{
person.Say();
}
Console.ReadKey();
}

在上面能看到1个问题,一般情况下.既然使用DI,就不知道具体的注入对象.所以强调面向接口编程.

所以实际上一般先定义接口,再通过DI容器创建对象.

    interface IPerson
{
void Say();
}
class Person : IPerson
{
public void Say()
{
Console.WriteLine("Person's say method is Called");
}
}

执行

        static void Main(string[] args)
{
var obj = CreateInstance(Assembly.GetExecutingAssembly(), "Demo.Person");
var person = obj as IPerson;
if (person != null)
{
person.Say();
}
Console.ReadKey();
}

DI框架

DI框架流行的有Castle Windsor,Unity...(Autofac Spring.Net已经聊过,不再演示)

在DI框架中,一般需要将对象注册到容器中,然后从容器解析出来.

Castle

Install-Package Castle.Windsor

待注入类

  interface ITransient
{ } interface IPerson
{
void Say();
}
class Person : IPerson, ITransient
{
public void Say()
{
Console.WriteLine("Person's say method is Called");
}
}

注册解析方式一

        static void Main(string[] args)
{
using (var container = new WindsorContainer())
{
container.Register(Component.For<Person, IPerson>());
var person = container.Resolve<IPerson>();
person.Say();
}
Console.ReadKey();
}

注册解析方式二

    public class AssmInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Classes.FromThisAssembly() //选择Assembly
.IncludeNonPublicTypes() //约束Type
.BasedOn<ITransient>() //约束Type
.WithService.DefaultInterfaces() //匹配类型
.LifestyleTransient()); //注册生命周期
}
}
        static void Main(string[] args)
{
using (var container = new WindsorContainer())
{
container.Install(new AssmInstaller());
var person = container.Resolve<IPerson>();
person.Say();
}
Console.ReadKey();
}

构造函数注入

    class Task : ITransient
{
public IPerson Person { get; set; }
public Task(IPerson person)
{
Person = person;
Person.Say();
}
}
        static void Main(string[] args)
{
using (var container = new WindsorContainer())
{
container.Install(new AssmInstaller());
container.Resolve<Task>();
}
Console.ReadKey();
}

属性注入

    class Task : ITransient
{
public IPerson Person { get; set; }
public Task()
{
}
public void Say()
{
Person.Say();
}
}
        static void Main(string[] args)
{
using (var container = new WindsorContainer())
{
container.Install(new AssmInstaller());
container.Resolve<Task>().Say();
}
Console.ReadKey();
}

MVC集成

Install-Package Castle.Windsor.Mvc

Application_Start注册

        protected void Application_Start()
{
RouteConfig.RegisterRoutes(RouteTable.Routes);
var container = new WindsorContainer()
.Install(FromAssembly.This());
var controllerFactory = new WindsorControllerFactory(container.Kernel);
ControllerBuilder.Current.SetControllerFactory(controllerFactory);
}

Installer注册

    public class AssmInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Classes.FromThisAssembly()
.IncludeNonPublicTypes()
.BasedOn<ITransient>()
.WithService.DefaultInterfaces()
.LifestyleTransient());
container.Register(Classes.FromThisAssembly()
.BasedOn<Controller>()
.LifestyleTransient()
);
}
}

这样Castle Windsor就能接管解析Controller了.

Unity

Install-Package Unity

待注入类

    public interface IPerson
{
void Say();
}
public class Person : IPerson
{
public void Say()
{
Console.WriteLine("Person's say method is Called");
}
}

注册解析一

        static void Main(string[] args)
{
using (var container = new UnityContainer())
{
container.RegisterType<IPerson, Person>(new TransientLifetimeManager());
var person = container.Resolve<IPerson>();
person.Say();
}
Console.ReadKey();
}

注册解析二

        static void Main(string[] args)
{
using (var container = new UnityContainer())
{
container.RegisterInstance<IPerson>(new Person());
var person = container.Resolve<IPerson>();
person.Say();
}
Console.ReadKey();
}

构造函数注入

    class Task : ITask
{
public IPerson Person { get; set; }
public Task(IPerson person)
{
Person = person;
Person.Say();
}
} public interface ITask
{ }
        static void Main(string[] args)
{
using (var container = new UnityContainer())
{
container.RegisterInstance<IPerson>(new Person());
container.RegisterType<ITask, Task>();
container.Resolve<ITask>();
}
Console.ReadKey();
}

属性注入

    class Task : ITask
{
[Dependency]
public IPerson Person { get; set; }
public Task(IPerson person)
{
Person = person;
}
public void Say()
{
Person.Say();
}
}
        static void Main(string[] args)
{
using (var container = new UnityContainer())
{
container.RegisterInstance<IPerson>(new Person());
container.RegisterType<ITask, Task>();
var task = container.Resolve<ITask>();
task.Say();
}
Console.ReadKey();
}

MVC集成

Install-Package Unity.Mvc

Application_Start注册

        protected void Application_Start()
{
RouteConfig.RegisterRoutes(RouteTable.Routes);
var container = new UnityContainer();
container.RegisterType<IPerson, Person>();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}

这样Unity就接管了Controller的创建

[Solution] DI原理解析及Castle、Unity框架使用的更多相关文章

  1. [Solution] AOP原理解析及Castle、Autofac、Unity框架使用

    本节目录: AOP介绍 AOP基本原理 AOP框架 Castle Core Castle Windsor Autofac Unity AOP介绍 面向切面编程(Aspect Oriented Prog ...

  2. AOP原理解析及Castle、Autofac、Unity框架使用

    转自:https://www.cnblogs.com/neverc/p/5241466.html AOP介绍 面向切面编程(Aspect Oriented Programming,英文缩写为AOP), ...

  3. DI 原理解析 并实现一个简易版 DI 容器

    本文基于自身理解进行输出,目的在于交流学习,如有不对,还望各位看官指出. DI DI-Dependency Injection,即"依赖注入":对象之间依赖关系由容器在运行期决定, ...

  4. [置顶] 滴滴插件化框架VirtualAPK原理解析(一)之插件Activity管理

    上周末,滴滴与360都开源了各自的插件化框架,VirtualAPK与RePlugin,作为一个插件化方面的狂热研究者,在周末就迫不及待的下载了Virtualapk框架来进行研究,本篇博客带来的是Vir ...

  5. ABP中动态WebAPI原理解析

    ABP中动态WebAPI原理解析 动态WebAPI应该算是ABP中最Magic的功能之一了吧.开发人员无须定义继承自ApiController的类,只须重用Application Service中的类 ...

  6. Spring IOC设计原理解析:本文乃学习整理参考而来

    Spring IOC设计原理解析:本文乃学习整理参考而来 一. 什么是Ioc/DI? 二. Spring IOC体系结构 (1) BeanFactory (2) BeanDefinition 三. I ...

  7. Web APi之过滤器创建过程原理解析【一】(十)

    前言 Web API的简单流程就是从请求到执行到Action并最终作出响应,但是在这个过程有一把[筛子],那就是过滤器Filter,在从请求到Action这整个流程中使用Filter来进行相应的处理从 ...

  8. JavaScript 模板引擎实现原理解析

    1.入门实例 首先我们来看一个简单模板: <script type="template" id="template"> <h2> < ...

  9. Request 接收参数乱码原理解析二:浏览器端编码原理

    上一篇<Request 接收参数乱码原理解析一:服务器端解码原理>,分析了服务器端解码的过程,那么浏览器是根据什么编码的呢? 1. 浏览器解码 浏览器根据服务器页面响应Header中的“C ...

随机推荐

  1. [Aaronyang] 写给自己的WPF4.5 笔记20 [3d课 1/4]

    假设你是高中毕业的,ok,数学知识几何知识中,我们学过  x,y,z   3个轴然后就可以画出形状了. 1. 新建空白窗体,grid换成canvas,然后新增一个Viewport3D元素 3d中显示的 ...

  2. 用C++为nodejs 写组件,提高node处理效率

    昨天研究了下如何用C++和node交互,在node的程序中,如果有大数据量的计算,处理起来比较慢,可以用C++来处理,然后通过回调(callback的形式),返回给node. 首先,先来看看node ...

  3. 用户管理 之 用户(User)和用户组(Group)配置文件详解

    用户(User)和用户组(Group)的配置文件,是系统管理员最应该了解和掌握的系统基础文件之一,从另一方面来说,了解这些文件也是系统安全管理的重要组成部份:做为一个合格的系统管理员应该对用户和用户组 ...

  4. iOS梦想之路-最新消息

    查看博客请转到 iCocos梦工厂 个人微信:18370997821 QQ:790806573 weibo:18370998721 谢谢:

  5. Haproxy配置支持https获取用户IP地址

    global log 127.0.0.1 local0 chroot /var/lib/haproxy #chroot运行路径 pidfile /var/run/haproxy.pid #haprox ...

  6. android 开发 - 使用okhttp框架封装的开发框架

    概述 在android开发中经常要访问网络,目前最流行的网络访问框架就是Okhttp了,然而我们在具体使用时,往往仍然需要二次封装.我使用Builder设计模式进行了封装形成oknet开源库. 介绍 ...

  7. Newtonsoft 自定义输出内容

    高级用法 1.忽略某些属性 2.默认值的处理 3.空值的处理 4.支持非公共成员 5.日期处理 6.自定义序列化的字段名称 7.动态决定属性是否序列化 8.枚举值的自定义格式化问题 9.自定义类型转换 ...

  8. Android M Permission 学习笔记

    Android应用权限简要介绍 一个Android应用默认情况下是不拥有任何权限的, 这即是说, 在默认情况下, 一个应用是没有权利去进行一些可能会造成不好影响的操作的. 这些不好的影响可能是对其它应 ...

  9. 使用DOSBox在Win7_x64下搭建汇编环境

    1. 软件安装 1. debug.exe,masm.exe,link.exe,edit.com等汇编工具,一般32位的windows系统有自带,但64位系统下并没有,而且将32位系统下的工具拷贝到64 ...

  10. 安装vim中文帮助vimcdoc

    1. 下载: 下载页面:http://vimcdoc.sourceforge.net/ 选择“Latest platform independent tarball, including an Lin ...