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. 【一天一道LeetCode】#130. Surrounded Regions

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

  2. Tomcat如何实现资源安全管理

    在了解了认证模式及Realm域后,我们看看Tomcat是如何设计实现资源安全管理的.在认证模式上,必须要支持多种认证模式,包括Basic模式.Digest模式.Form模式.Spnego模式.SSL模 ...

  3. 【Android 应用开发】Android 网络编程 API笔记 - java.net 包相关 接口 api

    Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...

  4. jsp中的路径与跳转

    在jsp(serlvet)中,页面的"变换"有两种方式,第一重定向,第二转发: 先说重定向,它的调用方式是这样的 response.sendredirect("uri&q ...

  5. 【Qt编程】设计ColorBar颜色栏

    画过图的都知道,我们常常用颜色的深浅来表示值的大小,在Matlab作图中,我们使用的是colorbar这个函数来给出颜色的直观参考.下面给出Matlab的示例:在Matlab命令窗口输入: figur ...

  6. 不要使用jQuery触发原生事件

    原文链接: DO NOT TRIGGER REAL EVENT NAMES WITH JQUERY! 原文日期: 2014年02月26日 翻译日期: 2014年03月2日 翻译人员: 铁锚 JavaS ...

  7. 《java入门第一季》之二维数组

    /* 格式2: 数据类型[][] 数组名 = new 数据类型[m][]; m:表示这个二维数组有多少个一维数组. 列数没有给出,可以动态的给.这一次是一个变化的列数. */ class Array2 ...

  8. RecyclerView notifyItem闪烁的问题

    之前我们做点赞,用listview做的话,就是在item实现点击后,写一个scal动画,不过现在都转到RecyclerView,那么要做这种效果于是做了一个notifyItemChanged()的操作 ...

  9. Linux打包命令 - tar

    上一篇文章谈到的命令大多仅能针对单一文件来进行压缩,虽然 gzip 与 bzip2 也能够针对目录来进行压缩, 不过,这两个命令对目录的压缩指的是『将目录内的所有文件 "分别" 进 ...

  10. 【51】java设计模式-工厂设计模式剖析

    工厂设计设计模式的分类: 工厂模式在<Java与模式>中分为三类: 1)简单工厂模式(Simple Factory):不利于产生系列产品: 2)工厂方法模式(Factory Method) ...