[IOC]Unity使用
Unity是什么?
unity是patterns&practices团队开发的一个轻量级、可扩展的依赖注入容器。
Unity特性
1、它提供了创建(或者装配)对象实例的机制,而这些对象实例可能还包含了其它被依赖的对象实例。
2、Unity允许将预先配置的对象注入到类中,实现了inversion of control(Ioc)的功能。在Unity中,支持constructor injection(构造器注入),property setter injection(属性设置值注入)和method call injection(方法注入)。
3、支持容器的体系结构。一个容器可以有子容器,允许从子容器到父容器的对象定位查询。
4、可以通过配置文件进行准备和配置容器。
5、不会影响到类的定义(属性设置值注入和方法注入除外),这也是轻量级容器的一个体现。
6、支持自定义的容器扩展。
Unity实践
新建一个控制台程序,Nuget安装Unity
新建一个叫IFlyable 飞行能力的接口。
/// <summary>
/// 飞行接口
/// </summary>
public interface IFlyable
{
void Fly();
}
一个飞禽类,并实现飞行的接口
/// <summary>
/// 飞禽类
/// </summary>
public class Bird : IFlyable
{
public void Fly()
{
Console.WriteLine("会飞的鸟......");
}
}
在Main方法中,通过Unity容器实例化一个飞禽对象,并让它飞。
static void Main(string[] args)
{
IUnityContainer container = new UnityContainer();
//注入
container.RegisterType<IFlyable, Bird>();
IFlyable bird = container.Resolve<IFlyable>();
bird.Fly();
Console.Read(); }
输出
如果多个实现类呢?
添加个飞机类,让其实现飞行接口
/// <summary>
/// 飞机
/// </summary>
public class Plane : IFlyable
{
public void Fly()
{
Console.WriteLine("超音速飞行......");
}
}
main方法
static void Main(string[] args)
{
IUnityContainer container = new UnityContainer();
//注入
container.RegisterType<IFlyable, Bird>();
container.RegisterType<IFlyable, Plane>();
IFlyable bird = container.Resolve<IFlyable>();
IFlyable plane = container.Resolve<IFlyable>();
bird.Fly();
plane.Fly();
Console.Read(); }
结果
Unity:在一个接口有多个实现的情况下,如果没有进行别名区分,会选择最后注入的实现。
加入别名
static void Main(string[] args)
{
IUnityContainer container = new UnityContainer();
//注入
container.RegisterType<IFlyable, Bird>("bird");
container.RegisterType<IFlyable, Plane>("plane");
IFlyable bird = container.Resolve<IFlyable>("bird");
IFlyable plane = container.Resolve<IFlyable>("plane");
bird.Fly();
plane.Fly();
Console.Read(); }
结果
注意
当一个接口有多个实现类的时候,注入的时候需要通过别名进行区分。
构造函数注入
我们添加一个接口
/// <summary>
/// 具有会叫能力的接口
/// </summary>
public interface ISayable
{
IFlyable Fly { set; get; }
void Say();
}
添加一个鹦鹉类,有飞行能力,并且会叫
/// <summary>
/// 鹦鹉类
/// </summary>
public class Parrot : ISayable
{
public IFlyable Fly
{
get;
set;
}
public Parrot(IFlyable fly)
{
this.Fly = fly;
} public void Say()
{
Console.WriteLine("会叫....");
}
}
main方法中,注入
static void Main(string[] args)
{
IUnityContainer container = new UnityContainer();
//注入
//构造函数中注入 鸟类对象
container.RegisterType<IFlyable, Bird>();
container.RegisterType<ISayable, Parrot>();
ISayable Parrot = container.Resolve<ISayable>();
Parrot.Fly.Fly();
Parrot.Say();
Console.Read(); }
结果
属性注入
/// <summary>
/// 鹦鹉类
/// </summary>
public class Parrot : ISayable
{
[Dependency]
public IFlyable Fly
{
get;
set;
}
public void Say()
{
Console.WriteLine("会叫....");
}
}
通过在属性上面添加[Dependency]特性,即可注入。
Main方法与上面的相同。
结果同样。
初始化器注入
说是初始化器,其实就是一个方法。但是个特别的方法,这个方法需要添加特性[InjectionMethod]
/// <summary>
/// 鹦鹉类
/// </summary>
public class Parrot : ISayable
{ public IFlyable Fly
{
get;
set;
}
[InjectionMethod]
public void Init(IFlyable fly)
{
this.Fly = fly;
}
public void Say()
{
Console.WriteLine("会叫....");
}
}
结果
[IOC]Unity使用的更多相关文章
- IOC : Unity 配置和使用
原文出自:IOC : Unity 配置和使用 之前Terry Lee 已经介绍过Unity的简单使用了,不过那篇文章是针对旧版本的,现在的版本1.2版略有不同. 我下载了Unity并做了一个简单的测试 ...
- IOC Unity
1. 依赖倒置原则和IOC2. IOC(Inversion of Control)的好处3. 介绍和使用Unity依赖倒置原则(DIP):上层和下层之间,依赖抽象,而不依赖细节IOC 控制反转,把上端 ...
- .Net Ioc Unity
Unity 的接口IUnityContainer public interface IUnityContainer : IDisposable IUnityContainer RegisterType ...
- .net web api ioc unity usage
1.use nuget to install unity.webapi 2.add configurations in application_start folder using Microsoft ...
- .Net IOC 之Unity
.Net IOC 之Unity 在码农的世界里,为了应付时常变更的客户需求,增加的架构的客扩展性,减少工作量.IOC诞生了,它是一种可以实现依赖注入和控制对象生命周期的容器.最为一个有节操.有追求的码 ...
- IOC容器:Unity
一.什么是IOC 学习IOC之前先来了解一个依赖导致原则(DIP),依赖导致原则是IOC的核心原理. 依赖导致:即上层模块不应该依赖于低层模块,二者应该通过抽象来依赖.依赖于抽象,而不是依赖于细节. ...
- IOC的理解,整合AOP,解耦对Service层和Dal层的依赖
DIP依赖倒置原则:系统架构时,高层模块不应该依赖于低层模块,二者通过抽象来依赖依赖抽象,而不是细节 贯彻依赖倒置原则,左边能抽象,右边实例化的时候不能直接用抽象,所以需要借助一个第三方 高层本来是依 ...
- 【Unity】微软的一款依赖注入组件
前言 前面学习了autofac这个依赖注入组件,本来是打算写在一起的,因为这个组件没打算像autofac一样详细的写,只是写下以前自己鼓捣玩搭建框架然后使用的一个依赖注入组件,并且也是进行了封装使用. ...
- _appstart.cshtml,_pagestart.cshtml,_viewstart.cshtml
ASP.NET MVC3 系列教程 – Web Pages 1.0 I:Web Pages 1.0中以"_"开头的特别文件(文件命名时不区分大小写) "_appstart ...
随机推荐
- js截取文件的名称
var str = 'aaa.fda.asp'; var arr = str.split('.');//通过\分隔字符串,成字符串数组 var last= arr[arr.length - 1];// ...
- css-使用line-height实现垂直居中的一些问题
网上都是这么说的,把line-height值设置为height一样大小的值可以实现单行文字的垂直居中.这句话确实是正确的,但其实也是有问题的.问题在于height,看我的表述:"把line- ...
- 【BZOJ-1103】大都市meg 树状数组 + DFS序
1103: [POI2007]大都市meg Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2009 Solved: 1056[Submit][Sta ...
- Java包的命名规范
indi : 个体项目,指个人发起,但非自己独自完成的项目,可公开或私有项目,版权主要属于发起者. 包名为indi.发起者名.项目名.模块名*.*.* pers : 个人项目,指个人发起,独自完成,可 ...
- SqlServerException:拒绝对表对象的select,insert权限解决(新建账号导致的问题)
继上一篇文章所述的问题,这次又出现了不能插入的问题.经过定位,也是由于我多选择了一个数据库用户角色的权限导致的,下面是详细的操作步骤 SqlServerException:拒绝了对对象 '...'(数 ...
- dedecms /member/reg_new.php SQL Injection Vul
catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 Dedecms会员中心注入漏洞 2. 漏洞触发条件 http://127 ...
- linux挂载远程samba目录
yum install cifs-utils #安装cifs协议包 #列出远程目录 smbclient -L 192.100.9.165 -Uadministrator vim /etc/fstab ...
- 遵循PSR-4的自动加载
一.简介 首先这里要了解PSR,Proposing a Standards Recommendation(提出标准建议)的缩写,就是一种PHP开发规范,让我们研发出来的代码更合理.更好维护.可读性更高 ...
- 整合Servlet到Spring容器
有时在Spring(3.2.5)项目中,如果使用到Servlet,可能希望Servlet实例作为bean受Spring容器管理,这样也能自动注入其他需要的bean,查了下,发现只针对过滤器提供了代理类 ...
- 通过Minimal版的iso安装CentOS7之后升级Desktop
重新安装了CentOS7,但是使用的是Minimal的iso镜像安装的,所以安装之后只有文本界面,这里记录一下重新安装图形界面的过程. 连接网络 通过文本界面登陆后是没有连接网络的,所以需要修改配置连 ...