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. MySQL进阶(一)主外键讲解

    1.什么是外键: 作为外键的字段. REFERENCES:映射到主表的字段2. ON DELETE后面的四个参数:代表的是当删除主表的记录时,所做的约定. RESTRICT(限制):如果你想删除的那个 ...

  2. Socket层实现系列 — 睡眠驱动的同步等待

    主要内容:Socket的同步等待机制,connect和accept等待的实现. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 概述 socket上定义了 ...

  3. 【一天一道LeetCode】#79. Word Search

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

  4. Java实现栈之计算器

    Java实现栈来做一个将中缀表达式转化为后缀表达式的程序,中缀表达式更符合我们的主观感受,后缀表达式更适合计算机的运算,下面直接上代码吧: package Character1; import jav ...

  5. android 4G产品4G网络问题记录

    电信.联通.移动切换到LTE_4G都不能通话(提示无法连接到网络)能正常上网,电信EVDO_3G不能通话(提示无法连接到网络)能正常上网这个是正常的,LTE只是针对上网,EVDO也是数据. 目前移动4 ...

  6. Leetcode_116_Populating Next Right Pointers in Each Node

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/43532817 Given a binary tree st ...

  7. FFMPEG结构体分析:AVPacket

    注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrame FFMPEG结构体分析:AVFormatContext FFMPEG结构体分析:AVCodecConte ...

  8. C# BarCodeToHTML条码生成类

    来自:http://www.sufeinet.com/forum.php?mod=viewthread&tid=656&extra=page%3D1%26filter%3Dtypeid ...

  9. 【cocos 2d-x】VS2012+win7+cocos2d-x3.0beta2开发环境配置

    本系列文章由@二货梦想家张程 所写,转载请注明出处. 作者:ZeeCoder  微博链接:http://weibo.com/zc463717263 我的邮箱:michealfloyd@126.com ...

  10. JavaScript单线程的疑问与解答

    问: JavaScript是单线程的,有任务队列,比如使用setTimeou(func,secs)来在secs毫秒后向任务队列添加func.但是,setTimeout后面跟一个死循环,那么死循环导致任 ...