IOC框架:Unity
Unity 是一个轻量级、可扩展的依赖注入容器,支持构造函数、属性和方法调用注入。
在进行项目之前通过Nuget安装Unity
简单的例子
定义一个接口
namespace UnityTest
{
//动物
public interface IAnimal
{
void Eat();
}
}
两个派生类
namespace UnityTest
{
//狗
public class Dog : IAnimal
{
public void Eat()
{
Console.WriteLine("正在吃狗粮");
}
}
//猫
public class Cat : IAnimal
{
public void Eat()
{
Console.WriteLine("正在吃猫粮");
}
}
}
namespace UnityTest
{
class Program
{
static void Main(string[] args)
{
//创建一个容器
IUnityContainer unityContainer = new UnityContainer();
//注册依赖对象 ,别名区分
unityContainer.RegisterType<IAnimal, Dog>("dog");
unityContainer.RegisterType<IAnimal, Cat>("cat"); IAnimal dog = unityContainer.Resolve<IAnimal>("dog");
IAnimal cat = unityContainer.Resolve<IAnimal>("cat"); dog.Eat();
cat.Eat(); Console.Read();
}
}
}
结果

构造函数注入
新加一个接口:
//午餐
public interface ILunch
{
void Doing();
}
派生类
public class Lunch : ILunch
{
private IAnimal animal; public Lunch(IAnimal aa)
{
this.animal = aa;
}
public void Doing()
{
animal.Eat();
}
}
namespace UnityTest
{
class Program
{
static void Main(string[] args)
{
//创建一个容器
IUnityContainer unityContainer = new UnityContainer();
//注册依赖对象
unityContainer.RegisterType<IAnimal, Dog>();
ILunch l = unityContainer.Resolve<Lunch>();
l.Doing();
Console.Read();
}
}
}
结果:

PS:
IoC容器会智能地选择选择和调用适合的构造函数以创建依赖的对象(自动使用参数最多的构造函数来进行创建对象)。假如在这个类中有多个构造函数时,而我们要指定其中一个作为Unity进行创建对象则必需用到[InjectionConstructor]
如果被选择的构造函数具有相应的参数,IoC容器在调用构造函数之前解析注册的依赖关系并自行获得相应参数对象。
属性注入
通过 set 对对象进行设值,只需要在调用对象的上面加上 [Dependency] 标记即可。当依赖对象被容器初始化以后,会自动对该对象设值。
public class Lunch : ILunch
{
[Dependency]
public IAnimal animal { get; set; } public void Doing()
{
animal.Eat();
}
}
方法注入
方法注入和构造注入差不多,只不过把构造函数变成了一个普通的方法,在方法前面加 [InjectionMethod] 属性。
public class Lunch : ILunch
{
private IAnimal Dog; [InjectionMethod]
public init(IAnimal aa)
{
this.Dog = aa;
}
public void Doing()
{
Dog.Eat();
}
}
配置文件形式注册
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Unity.Configuration" />
</configSections>
<unity>
<alias alias="IAnimal" type="UnityTest.IAnimal, UnityTest"></alias>
<alias alias="ILunch" type="UnityTest.ILunch, UnityTest"></alias>
<containers>
<container name="MyContainer">
<register name="D" type="IAnimal" mapTo="UnityTest.Dog,UnityTest"></register>
<register name="C" type="IAnimal" mapTo="UnityTest.Cat, UnityTest"></register>
</container>
</containers>
</unity>
<!--startup必须放在<configSections>节点下面,否则报错-->
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
</configuration>
class Program
{
static void Main(string[] args)
{ UnityContainer container = new UnityContainer();
UnityConfigurationSection config = (UnityConfigurationSection)ConfigurationManager.GetSection(UnityConfigurationSection.SectionName);
config.Configure(container, "MyContainer");
//若是只有一个基类,可以没有别名,本文例子,该接口有多个基类所以要别名
IAnimal aa = container.Resolve<IAnimal>("D"); aa.Eat(); Console.Read();
}
}
IOC框架:Unity的更多相关文章
- .NET MVC4 实训记录之一(引入Unity3.0 Ioc框架)
一直在做维护项目,没有机会接触完整的架构,于是自学.NET MVC.自今日起,将自学的过程.遇到的问题以及解决方案记录下来. 在WebApp项目中右键,使用NuGet引入Unity3.0.
- .Net常见的IOC框架及AOP框架
IOC框架 Unity:微软patterns&practicest团队开发的IOC依赖注入框架,支持AOP横切关注点. MEF(Managed Extensibility Framework) ...
- .Net IOC 框架
CastleWindsor 参见:CastleWindsor | .Net IOC 框架 AutoFace 参见:AutoFace | .Net IOC 框架 Unity 参见:Unity | .Ne ...
- 使用Microsoft的IoC框架:Unity来对.NET应用进行解耦
1.IoC/DI简介 IoC 即 Inversion of Control,DI 即 Dependency Injection,前一个中文含义为控制反转,后一个译为依赖注入,可以理解成一种编程模式,详 ...
- 依赖反转Ioc和unity,autofac,castle框架教程及比较
1.依赖倒置的相关概念 http://www.cnblogs.com/fuchongjundream/p/3873073.html IoC模式(依赖.依赖倒置.依赖注入.控制反转) 2.依赖倒置的方式 ...
- MVC4 基于 Unity Ioc 框架的 ControllerFactory
首先引入Untiy框架. 可以在NuGet程序包 管理器中直接安装. 新建 继承DefaultControllerFactory 的UnityControllerFactory: 重写虚方法GetC ...
- 今天研究Unity Ioc 框架
今天研究Unity Ioc 框架,被自己坑了两个多小时. 运行就报错,反反复复检查了很多次,配置文件,代码都没有问题,也从新写了好几遍. 最后仔细看报错消息才知道,config文件没有生成到目录……… ...
- 各大主流.Net的IOC框架性能测试比较
Autofac下载地址:http://code.google.com/p/autofac/ Castle Windsor下载地址:http://sourceforge.net/projects/cas ...
- .NET领域最为流行的IOC框架之一Autofac
一.前言 Autofac是.NET领域最为流行的IOC框架之一,微软的Orchad开源程序使用的就是Autofac,Nopcommerce开源程序也是用的Autofac. Orchad和Nopcomm ...
- IOC框架Ninject实践总结
原文地址:http://www.cnblogs.com/jeffwongishandsome/archive/2012/04/15/2450462.html IOC框架Ninject实践总结 一.控制 ...
随机推荐
- Java实现堆的封装,进行插入,调整,删除堆顶以完成堆排序实例
简介 堆对于排序算法是一个比较常用的数据结构,下面我就使用Java语言来实现这一算法 首先,我们需要知道堆的数据结构的形式,其实就是一个特殊的二叉树.但是这个二叉树有一定的特点,除了是完全二叉树以外, ...
- UI设计——最后一根稻草
WindowsLive提供的本地地图服务看起来挺简单的,但其实非常难用: 跟其他人一样,每当我接触到一个新的地图服务,我做的第一件事总是拿当前的地址去试一试.我在上面输入的是我工作的地方.但是,当我敲 ...
- linux的date的几个例子
shell脚本为test.sh: input=$1 echo "sdfa:${input}" echo ${input} echo "dfadf"${input ...
- numpy教程:矩阵matrix及其运算
http://blog.csdn.net/pipisorry/article/details/48791403 numpy矩阵简介 NumPy函数库中存在两种不同的数据类型(矩阵matrix和数组ar ...
- 【leetcode82】Linked List Cycle
题目描述: 判断有序list是不是环 要求: 时间复杂度o(n) 原文描述: Given a linked list, determine if it has a cycle in it. Follo ...
- Dynamics CRM 同一实体多个Form显示不同的Ribbon按钮
自CRM2011引入多FORM窗体,并且对不同的窗体引入了角色控制,给我们的客制化开发带来了多样化,既然有了多窗体也就理所当然的有了在不同的窗体显示不同的Ribbon按钮的需求,具体怎么做见下面的博客 ...
- shell,python获取当前路径(脚本的当前路径) (aso项目记录)
一.shell获取脚本当前路径 cur_dir=$(cd "$(dirname "$0")"; pwd) #获取当前脚本的绝对路径,参数$0是当前脚本对象 等 ...
- 我所犯的JavaScript引用错误
近期在w3cschool学习JavaScript和php--学完后,开始帮一哥们友情写网站.但是在使用ajax和Jquery的时候发现,我自己写的脚本不能运行.捣鼓了半天,没有发现任何语句错误.调试器 ...
- TCP中的MSS解读(转)
本文摘录自TCP中的MSS解读. MSS 是TCP选项中最经常出现,也是最早出现的选项.MSS选项占4byte.MSS是每一个TCP报文段中数据字段的最大长度,注意:只是数据部分的字段,不包括TCP的 ...
- Java-HttpServletResponse-HttpServletResponseWrapper
//继承ServletResponse,发送回复信息,servlet容器创建一个HttpServletResponse对象,将它作为service函数的参数 public interface Http ...