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的更多相关文章

  1. .NET MVC4 实训记录之一(引入Unity3.0 Ioc框架)

    一直在做维护项目,没有机会接触完整的架构,于是自学.NET MVC.自今日起,将自学的过程.遇到的问题以及解决方案记录下来. 在WebApp项目中右键,使用NuGet引入Unity3.0.

  2. .Net常见的IOC框架及AOP框架

    IOC框架 Unity:微软patterns&practicest团队开发的IOC依赖注入框架,支持AOP横切关注点. MEF(Managed Extensibility Framework) ...

  3. .Net IOC 框架

    CastleWindsor 参见:CastleWindsor | .Net IOC 框架 AutoFace 参见:AutoFace | .Net IOC 框架 Unity 参见:Unity | .Ne ...

  4. 使用Microsoft的IoC框架:Unity来对.NET应用进行解耦

    1.IoC/DI简介 IoC 即 Inversion of Control,DI 即 Dependency Injection,前一个中文含义为控制反转,后一个译为依赖注入,可以理解成一种编程模式,详 ...

  5. 依赖反转Ioc和unity,autofac,castle框架教程及比较

    1.依赖倒置的相关概念 http://www.cnblogs.com/fuchongjundream/p/3873073.html IoC模式(依赖.依赖倒置.依赖注入.控制反转) 2.依赖倒置的方式 ...

  6. MVC4 基于 Unity Ioc 框架的 ControllerFactory

    首先引入Untiy框架. 可以在NuGet程序包 管理器中直接安装. 新建 继承DefaultControllerFactory  的UnityControllerFactory: 重写虚方法GetC ...

  7. 今天研究Unity Ioc 框架

    今天研究Unity Ioc 框架,被自己坑了两个多小时. 运行就报错,反反复复检查了很多次,配置文件,代码都没有问题,也从新写了好几遍. 最后仔细看报错消息才知道,config文件没有生成到目录……… ...

  8. 各大主流.Net的IOC框架性能测试比较

    Autofac下载地址:http://code.google.com/p/autofac/ Castle Windsor下载地址:http://sourceforge.net/projects/cas ...

  9. .NET领域最为流行的IOC框架之一Autofac

    一.前言 Autofac是.NET领域最为流行的IOC框架之一,微软的Orchad开源程序使用的就是Autofac,Nopcommerce开源程序也是用的Autofac. Orchad和Nopcomm ...

  10. IOC框架Ninject实践总结

    原文地址:http://www.cnblogs.com/jeffwongishandsome/archive/2012/04/15/2450462.html IOC框架Ninject实践总结 一.控制 ...

随机推荐

  1. UIPassValue页面传值&nbsp;UI_08(下)

    2.从前一个界面到后一个界面 注意:解题思路  葵花宝典:属性传值  第一步:在下一个界面视图控制器的.h文件中定义一个属性  第二步:在push之前将数据存储到属性中  第三步:取出属性中的值让控件 ...

  2. SpriteBuilder复杂CCB在App场景加载时报错排查

    Player.CCB由body和arm两部分组成,它们都开启物理使能. 在GameScene.ccb中新建一个物理对象,将Player.ccb拖入该对象.此时编译运行App均正常. 然后继续添加其他物 ...

  3. 小强的HTML5移动开发之路(7)——坦克大战游戏1

    来自:http://blog.csdn.net/dawanganban/article/details/17693145 上一篇中我们介绍了关于Canvas的基础知识,用Canvas绘制各种图形和图片 ...

  4. AngularJS进阶(三十四)Angular数据更新不及时问题探讨

    Angular数据更新不及时问题探讨 前言 在修复控制角标正确变化过程中,发觉前端代码组织层次出现了严重问题.传递和共享数据时自己使用的是rootScope,为此造成了全局变量空间的污染.根据< ...

  5. 【一天一道LeetCode】#41. First Missing Positive

    一天一道LeetCode系列 (一)题目 Given an unsorted integer array, find the first missing positive integer. For e ...

  6. (二)plist的使用和序列帧动画

    六.plist的使用方法: iOS的程序在安装在手机上以后会把全部资源文件集成在一个文件夹中,这种文件集合称为bundle,对于一般的工程,只有一个bundle,即mainbundle,因此可以通过b ...

  7. Mahout朴素贝叶斯文本分类

    Mahout朴素贝叶斯文本分类算法 Mahout贝叶斯分类器按照官方的说法,是按照<Tackling the PoorAssumptions of Naive Bayes Text Classi ...

  8. 目前调试移动设备程序只能通过USB线缆

    就像iOS,转移(到设备上)并调试App不可能通过WiFi或蓝牙连接. 一个有线的USB线缆连接现今主要用来调试. 确保你直接将Android设备插入Mac的USB接口,避免使用USB hubs和扩展 ...

  9. mysql进阶(八)怎么对varchar类型排序问题

    MySQL中怎么对varchar类型排序问题 asc 升级 desc降序 在mysql默认order by 只对数字与日期类型可以排序,但对于varchar字符型类型排序好像没有用了,下面我来给各位同 ...

  10. 【一天一道LeetCode】#21. Merge Two Sorted Lists

    一天一道LeetCode系列 (一)题目 Merge two sorted linked lists and return it as a new list. The new list should ...