.Net IOC框架入门之——Unity
一、概述
IOC:英文全称:Inversion of Control,中文名称:控制反转,它还有个名字叫依赖注入(Dependency Injection)。
作用:将各层的对象以松耦合的方式组织在一起,解耦,各层对象的调用完全面向接口。当系统重构的时候,代码的改写量将大大减少。
依赖注入: 当一个类的实例需要另一个类的实例协助时,在传统的程序设计过程中,通常有调用者来创建被调用者的实例。然而采用依赖注入的方式,创建被调用者的工作不再由调用者来完成,因此叫控制反转,创建被调用者的实例的工作由IOC容器来完成,然后注入调用者,因此也称为依赖注入。
Unity是微软Patterns & Practices团队所开发的一个轻量级的,并且可扩展的依赖注入(Dependency Injection)容器;
它支持常用的三种依赖注入方式:构造器注入(Constructor Injection)、属性注入(Property Injection),以及方法调用注入(Method Call Injection)。
现在Unity最新的版本的4.0版,可以在微软的开源站点 https://github.com/unitycontainer/unity 下载最新的发布版本。
通过使用Unity,我们能轻松构建松耦合结构的程序,从而让整个程序框架变得清晰和易于维护。
二、简单示例
创建一个mvc5项目 Web.Mvc,然后在创建一个Business类库,将类库添加引用到Web.Mvc项目.
Business类库
类库代码
a、Business类库定义一个接口IUserService

namespace Business
{
/// <summary>
/// 显示信息
/// </summary>
public interface IUserService
{
string Display(string mes);
}
}

b、Business类库实现接口

namespace Business
{
public class UserService : IUserService
{
/// <summary>
/// 显示信息
/// </summary>
/// <param name="mes"></param>
public string Display(string mes)
{
return "I say:" + mes;
}
}
}

示例一
在Web.Mvc项目通过nuget添加unity.mvc5 (1.2.3)
1.注册服务
注册依赖使用依赖注入生效,在Web.Mvc项目的Global.asax进行注册

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using Business;
using Microsoft.Practices.Unity;
using Unity.Mvc5; namespace Web.Mvc
{
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles); //注入 Ioc
var container = this.BuildUnityContainer();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
} IUnityContainer BuildUnityContainer()
{
var container = new UnityContainer();
container.RegisterType<IUserService, UserService>();
return container;
}
}
}

2.注入服务

namespace Web.Mvc.Controllers
{
public class HomeController : Controller
{ private IUserService userService; public HomeController(IUserService userService)
{
this.userService = userService;
} public ActionResult Index()
{
ViewBag.Msg = userService.Display("hahaha");
return View();
}
}
}

e、在Index.cshtml找个地方写入@ViewBag.Msg 就可以,如
<h1>ASP.NET - @ViewBag.Msg</h1>
最后运行项目,实现效果
ASP.NET - I say:hahaha
示例二
本示例为2017.12.08补充。
创建一个mvc5项目 Web.Mvc,然后在创建一个Business类库,将类库添加引用到Web.Mvc项目,在Web.Mvc项目通过nuget添加unity.mvc5 (1.3.0)
命令:Install-Package Unity.Mvc5 -Version 1.3.0
安装后如图
1. 调用注册组件
在Global.asax.cs 的Application_Start 方法添加 UnityConfig.RegisterComponents() ,MVC会使用 Unity.Mvc5的 DependencyResolver去解析服务

protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
UnityConfig.RegisterComponents();//在此处添加
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles); }

2.注册服务
找到App_Start下的UnityConfig类,如下修改

public static class UnityConfig
{
public static void RegisterComponents()
{
var container = new UnityContainer(); //在这里使用container注册所有服务
container.RegisterType<IUserService, UserService>();//自定义的服务 DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}
}

3.修改控制器Home和页面Index

public class HomeController : Controller
{
private IUserService userService; public HomeController(IUserService userService)
{
this.userService = userService;
} public ActionResult Index()
{
ViewBag.Name = userService.Display("我是 UNITY 1.3.0");
return View();
}

页面代码
<div class="jumbotron">
<h1>Unity 入门</h1>
<p class="lead">@ViewBag.Name</p>
</div>
效果
三、注册封装
对示例一 的注册进行独立封装到BootStrapper中
c、注册依赖使用依赖注入生效
在Web.Mvc项目的Global.asax进行注册

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using Business;
using Microsoft.Practices.Unity;
using Unity.Mvc5; namespace Web.Mvc
{
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles); //注入 Ioc
BootStrapper.Initialise();
}
}
}

BootStrapper代码

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Business;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Configuration;
using Unity.Mvc5; namespace Web.Mvc
{
public class BootStrapper
{
/// <summary>
/// 获取容器-注册依赖关系
/// </summary>
/// <returns></returns>
public static IUnityContainer Initialise()
{
var container = BulidUnityContainer();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
return container;
} /// <summary>
/// 加载容器
/// </summary>
/// <returns></returns>
private static IUnityContainer BulidUnityContainer()
{
var container = new UnityContainer();
RegisterTypes(container);
return container;
} /// <summary>
/// 实施依赖注入
/// </summary>
/// <param name="container"></param>
private static void RegisterTypes(IUnityContainer container)
{
//类型的配置容器注册
container.RegisterType<IUserService, UserService>();
//container.RegisterType<IUserService, UserService>(new ContainerControlledLifetimeManager());//通过生命周期实现了单例模式 //已有对象实例的配置容器注册,也为单例
//UserService userService = new UserService();
//container.RegisterInstance<IUserService>(userService); }
}
}

Unity注册配置
修改上面的方法,将注册放到配置文件中
1.方法修改

/// <summary>
/// 实施依赖注入
/// </summary>
/// <param name="container"></param>
private static void RegisterTypes(IUnityContainer container)
{
////依赖关系可以选择代码形式,也可以用配置文件的形式
UnityConfigurationSection config = (UnityConfigurationSection)ConfigurationManager.GetSection(UnityConfigurationSection.SectionName);
config.Configure(container, "defaultContainer");
}

UnityConfigurationSection.SectionName为unity
2.配置文件
提示:自定义web.config节点来实现

<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/>
<!-- 一般将unity节点放到文件末尾 -->
</configSections> <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<namespace name="Business" />
<assembly name="Business" />
<containers>
<container name="defaultContainer">
<register type="IUserService" mapTo="UserService">
<lifetime type="singleton" />
</register>
<register type="ILocalUserService" mapTo="LocalUserService"/>
</container>
</containers>
</unity>
</configuration>

或者为
直接指定命名空间

<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<assembly name="Business" />
<containers>
<container name="defaultContainer">
<register type="Business.IUserService" mapTo="Business.UserService">
<lifetime type="singleton" />
</register>
<register type="Business.ILocalUserService" mapTo="Business.LocalUserService"/>
</container>
</containers>
</unity>

或者为
指定程序集名称

<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<containers>
<container name="defaultContainer">
<register type="Business.IUserService,Business" mapTo="Business.UserService,Business">
<lifetime type="singleton" />
</register>
<register type="Business.ILocalUserService,Business" mapTo="Business.LocalUserService,Business"/>
</container>
</containers>
</unity>

源码下载:https://gitee.com/zmsofts/XinCunShanNianDaiMa/blob/master/IocDemo.rar
参考网址:
http://www.cnblogs.com/zhangchenliang/archive/2013/01/08/2850970.html
https://www.lanhusoft.com/Article/108.html
http://blog.csdn.net/xingxing513234072/article/details/21176247
http://www.cnblogs.com/wwj1992/p/6728370.html
http://www.cnblogs.com/xishuai/p/3670292.html(推荐)
.Net IOC框架入门之——Unity的更多相关文章
- .Net IOC框架入门之一 Unity
一.概述 IOC:英文全称:Inversion of Control,中文名称:控制反转,它还有个名字叫依赖注入(Dependency Injection). 作用:将各层的对象以松耦合的方式组织在一 ...
- .Net IOC框架入门之三 Autofac
一.简介 Autofac是.NET领域最为流行的IOC框架之一,传说是速度最快的一个 目的 1.依赖注入的目的是为了解耦. 2.不依赖于具体类,而依赖抽象类或者接口,这叫依赖倒置. 3.控制反转即 ...
- .Net IOC框架入门之——Autofac
一.简介 Autofac是.NET领域最为流行的IOC框架之一,传说是速度最快的一个 目的 1.依赖注入的目的是为了解耦.2.不依赖于具体类,而依赖抽象类或者接口,这叫依赖倒置.3.控制反转即IoC ...
- .Net IOC框架入门之二 CastleWindsor
一.简介 Castle是.net平台上的一个开源项目,为企业级开发和WEB应用程序开发提供完整的服务,用于提供IOC的解决方案.IOC被称为控制反转或者依赖注入(Dependency Injectio ...
- .Net IOC框架入门之——CastleWindsor
一.简介 Castle是.net平台上的一个开源项目,为企业级开发和WEB应用程序开发提供完整的服务,用于提供IOC的解决方案.IOC被称为控制反转或者依赖注入(Dependency Injectio ...
- Unity框架入门
介绍Unity框架之前,先要说几个概念DIP依赖倒置原则.IOC控制反转.DI依赖注入 DIP是设计原则之一,定义:上层不应该依赖于底层,两者都依赖于抽象: 抽象不依赖于细节,细节应该依赖于抽象. 像 ...
- 使用Microsoft的IoC框架:Unity来对.NET应用进行解耦
1.IoC/DI简介 IoC 即 Inversion of Control,DI 即 Dependency Injection,前一个中文含义为控制反转,后一个译为依赖注入,可以理解成一种编程模式,详 ...
- MVC4 基于 Unity Ioc 框架的 ControllerFactory
首先引入Untiy框架. 可以在NuGet程序包 管理器中直接安装. 新建 继承DefaultControllerFactory 的UnityControllerFactory: 重写虚方法GetC ...
- 今天研究Unity Ioc 框架
今天研究Unity Ioc 框架,被自己坑了两个多小时. 运行就报错,反反复复检查了很多次,配置文件,代码都没有问题,也从新写了好几遍. 最后仔细看报错消息才知道,config文件没有生成到目录……… ...
随机推荐
- LCD RGB 控制技术讲解 — 时钟篇(上)【转】
1. 时序图 下面是LCD RGB 控制的典型时序图 天啊,一下就上这玩意,怎么看??? 其实要解释上面的时序图,我们还需要了解一些LCD的显示过程.所以现在只是有个印象,稍后我们详细讲解. 2. L ...
- Python环境安装与基础语法(4)——内存管理、if分支
Python内存管理 python中有自动清理内存垃圾的功能,当变量的引用计数为0,则可以被有计划的垃圾回收GC 常量会在系统中被多次引用,所以常量的引用计数无法确定 程序控制 顺序:按照先后顺序逐条 ...
- 安装教程-VMware 12 安装企业级 CentOS 7.6
企业级 CentOS 7.6 系统的安装 1.实验描述 在虚拟机中,手动安装 CentOS 7.6 操作系统,为学习 Linux 提供平台,因此,有的参数有些差异,请勿较真. 2.实验环境 物理机系统 ...
- 团队——Alpha2版本发布
这个作业属于哪个课程 课程链接 这个作业要求在哪里 作业要求的链接 团队名称 杨荣模杰和他的佶祥虎 这个作业的目标 发布并说明产品Alpha2版本 一.团队成员的学号姓名列表 学号 姓名 201731 ...
- 2.4 Scala函数式编程
一.函数定义与使用 1.函数的定义 2.匿名函数 举例: Scala自动推断变量类型,不用声明: 一个下划线只能表示这一个参数的一次出现 二.高阶函数 定义:函数定义的括号里仍然是个函数的函数,叫作高 ...
- 2019面向对象程序设计(Java) 第17周-18周学习指导及要求
2019面向对象程序设计(Java)第17周-18周学习指导及要求 (2019.12.20-2019.12.31) 学习目标 (1) 理解和掌握线程的优先级属性及调度方法: (2) 掌握线程同步的 ...
- 实现 Trie (前缀树)
实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作. 示例: Trie trie = new Trie(); trie.insert(" ...
- day4_常用的内置函数
# dict() 工厂函数, 生成字典 a = dict(u=2, i="hello", **{"kk":"cc"}) a = dict(y ...
- svn版本库操作(四)
一.使用命令行模式访问 SVN 服务器 1. 检出(checkout) (1) 首先进入自己的工作目录,例如:D:\svnSpace cd D:\svnSpace (2) 运行 svn checkou ...
- 水晶报表报错:log4net初始值问题
运行水晶报表的程序一直出错,报错如下: System.TypeInitializationException: “CrystalDecisions.ReportSource.ReportSourceF ...