.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文件没有生成到目录……… ...
随机推荐
- docker仓库资源的地址修改
docker仓库资源的地址修改 1.新增或者修改/etc/docker目录下的daemon.json文件 样例文件如下 { "registry-mirrors": ["h ...
- 004-OpenStack-计算服务
OpenStack-计算服务 [基于此文章的环境]点我快速打开文章 1.控制节点(controller) 1.1 创库授权 nova_api, nova, 和 nova_cell0 mysql CR ...
- Flask请求和应用上下文源码分析
flask的request和session设置方式比较新颖,如果没有这种方式,那么就只能通过参数的传递. flask是如何做的呢? 1:本地线程,保证即使是多个线程,自己的值也是互相隔离 1 im ...
- 《SQL Server 2008 R2》 收缩数据库日志文件
USE [master] GO /****** Object: StoredProcedure [dbo].[pro_Shrink_Log] Script Date: 2019/8/16 16:56: ...
- NLP中的预训练语言模型(四)—— 小型化bert(DistillBert, ALBERT, TINYBERT)
bert之类的预训练模型在NLP各项任务上取得的效果是显著的,但是因为bert的模型参数多,推断速度慢等原因,导致bert在工业界上的应用很难普及,针对预训练模型做模型压缩是促进其在工业界应用的关键, ...
- python gyp
https://github.com/bnoordhuis/gyp 所以,手动加了这个变量 https://blog.csdn.net/weixin_30576827/article/details/ ...
- Meven父工程子模块的SSM框架实现银行转账
<Meven父工程子模块的SSM框架实现银行转账> 课程实验报告 实验名称 Meven父工程子模块的SSM框架实现 ...
- Windows解决端口占用问题
Windows解决端口占用问题 步骤 1. win + R,输入cmd回车进入dos界面 2. 输入netstat -ano|findstr 8080 查看占用8080端口的进程 3. 输入taskk ...
- svn服务器端程序安装(二)
1.下载 Setup-Subversion-1.8.9-1.msi 2. 双击,一直next (1) 修改安装地址,要求是非中文无空格 3. 安装完成后,检查是否已添加到系统的环境变量PATH中,若没 ...
- 在WEB显示实时视频流
转载自:https://www.jianshu.com/p/7ef5490fbef7 安装摄像头 这里使用的是树莓派的官方摄像头,使用普通的 USB 摄像头也可以,但前提是你能够搞的定它的驱动. 大概 ...