构造器注入(Constructor Injection):IoC容器会智能地选择选择和调用适合的构造函数以创建依赖的对象。如果被选择的构造函数具有相应的参数,IoC容器在调用构造函数之前会自定义创建相应参数对象;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//1.创建一个UnityContainer对象
//2.通过UnityContainer对象的RegisterType方法来注册对象与对象之间的关系
//3.通过UnityContainer对象的Resolve方法来获取指定对象关联的对象
UnityContainer container = new UnityContainer();//创建容器
container.RegisterType<IWaterTool, PressWater>();//注册依赖对象 默认注册(无命名),如果后面还有默认注册会覆盖前面的
container.RegisterType<IWaterTool, PressWater>("PressWater1"); //命名注册
IWaterTool water = container.Resolve<IWaterTool>();
IWaterTool water1 = container.Resolve<IWaterTool>("PressWater1");
Console.WriteLine(water.returnWater());
Console.WriteLine(water1.returnWater());
Console.Read();
}
} /// <summary>
/// 压水井
/// </summary>
public class PressWater : IWaterTool
{
public string returnWater()
{
return "地下水好甜啊!!!";
}
} /// <summary>
/// 获取水方式接口
/// </summary>
public interface IWaterTool
{
string returnWater();
}
}
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//1.在配置文件<configSections> 配置节下注册名为unity的section
//2.在<configuration> 配置节下添加Unity配置信息
//3.在代码中读取配置信息,并将配置载入到UnityContainer中
IUnityContainer container = new UnityContainer();
container.LoadConfiguration("MyContainer");
UnityConfigurationSection section
= (UnityConfigurationSection)ConfigurationManager.GetSection("unity");//获取指定名称的配置节
section.Configure(container, "MyContainer");//获取特定配置节下已命名的配置节<container name='MyContainer'>下的配置信息 IWaterTool water = container.Resolve<IWaterTool>("PressWater");
Console.WriteLine(water.returnWater());
Console.Read();
}
} /// <summary>
/// 压水井
/// </summary>
public class PressWater : IWaterTool
{
public string returnWater()
{
return "地下水好甜啊!!!";
}
} /// <summary>
/// 获取水方式接口
/// </summary>
public interface IWaterTool
{
string returnWater();
}
}
<?xml version="1.0" encoding="utf-8"?>
<configuration> <configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/>
</configSections> <unity>
<!--定义类型别名-->
<aliases>
<add alias="IWaterTool" type="ConsoleApplication1.IWaterTool,ConsoleApplication1" />
<add alias="PressWater" type="ConsoleApplication1.PressWater,ConsoleApplication1" />
</aliases>
<!--容器-->
<container name="MyContainer">
<!--映射关系-->
<register type="IWaterTool" mapTo="PressWater" name="PressWater"></register>
</container>
</unity> <startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
</startup>
</configuration>
属性注入(Property Injection):如果需要使用到被依赖对象的某个属性,在被依赖对象被创建之后,IoC容器会自动初始化该属性;
class Program
{
static void Main(string[] args)
{
UnityContainer container = new UnityContainer();
container.RegisterType<IPeople, VillagePeople>();
container.RegisterType<IWaterTool, PressWater>();
IPeople people = container.Resolve<IPeople>();
Console.WriteLine(people._pw.returnWater());
people.DrinkWater();
Console.Read();
}
} /// <summary>
/// 压水井
/// </summary>
public class PressWater : IWaterTool
{
public string returnWater()
{
return "地下水好甜啊!!!";
}
} /// <summary>
/// 获取水方式接口
/// </summary>
public interface IWaterTool
{
string returnWater();
} /// <summary>
/// 人接口
/// </summary>
public interface IPeople
{
IWaterTool _pw { get; set; }
void DrinkWater();
} /// <summary>
/// 村民
/// </summary>
public class VillagePeople : IPeople
{
[Dependency]
public IWaterTool _pw { get; set; }
public VillagePeople(IWaterTool pw)
{
_pw = pw;
}
public void DrinkWater()
{
Console.WriteLine(_pw.returnWater());
}
}
方法注入(Method Injection):如果被依赖对象需要调用某个方法进行相应的初始化,在该对象创建之后,IoC容器会自动调用该方法。
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
UnityContainer container = new UnityContainer();
container.RegisterType<IPeople, VillagePeople>();
container.RegisterType<IWaterTool, PressWater>();
IPeople people = container.Resolve<IPeople>();
Console.WriteLine(people._pw.returnWater());
people.DrinkWater();
Console.Read();
}
} /// <summary>
/// 压水井
/// </summary>
public class PressWater : IWaterTool
{
public string returnWater()
{
return "地下水好甜啊!!!";
}
} /// <summary>
/// 获取水方式接口
/// </summary>
public interface IWaterTool
{
string returnWater();
} /// <summary>
/// 人接口
/// </summary>
public interface IPeople
{
IWaterTool _pw { get; set; }
void DrinkWater();
void ObjectInit();
} /// <summary>
/// 村民
/// </summary>
public class VillagePeople : IPeople
{
[Dependency]
public IWaterTool _pw { get; set; }
public VillagePeople(IWaterTool pw)
{
_pw = pw;
}
public void DrinkWater()
{
Console.WriteLine(_pw.returnWater());
}
[InjectionMethod]
public void ObjectInit()
{
Console.WriteLine("方法注入");
}
}
}
Unity依赖注入使用的更多相关文章
-
Unity 依赖注入之二
1. 构造子注入 1.1 构造子注入初级代码 container.RegisterType<IMyWork, MyWork>(new InjectionConstructor(new Bo ...
-
Unity依赖注入使用详解
写在前面 构造器注入 Dependency属性注入 InjectionMethod方法注入 非泛型注入 标识键 ContainerControlledLifetimeManager单例 Unity注册 ...
-
WPF PRISM开发入门二(Unity依赖注入容器使用)
这篇博客将通过一个控制台程序简单了解下PRISM下Unity依赖注入容器的使用.我已经创建了一个例子,通过一个控制台程序进行加减乘除运算,项目当中将输入输出等都用接口封装后,结构如下: 当前代码可以点 ...
-
C# Unity依赖注入
简介: 控制反转:我们向IOC容器发出获取一个对象实例的一个请求,IOC容器便把这个对象实例“注入”到我们的手中,在这个过程中你不是一个控制者而是一个请求者,依赖于容器提供给你的资源,控制权落到了容器 ...
-
Unity 依赖注入
关于Ioc的框架有很多,比如astle Windsor.Unity.Spring.NET.StructureMap,我们这边使用微软提供的Unity做示例,你可以使用Nuget添加Unity,也可以引 ...
-
c# Unity依赖注入WebService
1.IOC与DI简介 IOC全称是Inversion Of Control(控制反转),不是一种技术,只是一种思想,一个重要的面相对象编程的法则,它能知道我们如何设计出松耦合,更优良的程序.传统应用程 ...
-
使用Microsoft.Practices.Unity 依赖注入
Unity是微软Patterns & Practices团队所开发的一个轻量级的,并且可扩展的依赖注入(Dependency Injection)容器,它支持常用的三种依赖注入方式:构造器注入 ...
-
使用Microsoft.Practices.Unity 依赖注入 转载https://www.cnblogs.com/slardar1978/p/4205394.html
Unity是微软Patterns & Practices团队所开发的一个轻量级的,并且可扩展的依赖注入(Dependency Injection)容器,它支持常用的三种依赖注入方式:构造器注入 ...
-
ASP.NET MVC5+EF6+EasyUI 后台管理系统(6)-Unity 依赖注入
系列目录 前言 为了符合后面更新后的重构系统,文章于2016-11-1日重写 本节重构一下代码,采用IOC控制反转,也就是依赖注入 您可以访问http://unity.codeplex.com/rel ...
-
Unity 依赖注入知识点
三种依赖注入方法,构造器注入.属性注入.方法注入 可以配置Config文件,来实现不用修改代码.需要先将接口与实体关联,然后使用时会自动加载对应实体. namespace WeChatConsole ...
随机推荐
-
盘点国内11家已经获得融资的移动CRM平台
盘点国内11家已经获得融资的移动CRM平台 亿欧网盘点了目前国内已经获得融资的11家移动CRM平台,它们分别是:纷享销客.红圈营销.小满科技.腾腾科技.麦客.美洽.销售易.快消总管.EC营客通.店小三 ...
-
gromacs, quake III和vrsqrtps
看标题大家可能觉得三个词汇风马牛不相及,第一个是解蛋白质分子动力学的软件,第二个是上三代宅男最爱雷神之锤,第三个则是一个存在于IntelSSE及AVX中的一个指令,他的作用是快速求平方根的倒数. 起因 ...
-
43. 动态规划求解n个骰子的点数和出现概率(或次数)[Print sum S probability of N dices]
[题目] 把N个骰子扔在地上,所有骰子朝上一面的点数之和为S.输入N,打印出S的所有可能的值出现的概率. [分析] 典型的动态规划题目. 设n个骰子的和为s出现的次数记为f(n,s),其中n=[1-N ...
-
(转载)读取xml中的指定节点的值
/// <summary> /// 读取xml中的指定节点的值 /// </summary> private st ...
-
python中List的sort方法的用法
python列表排序 简单记一下python中List的sort方法(或者sorted内建函数)的用法. 关键字: python列表排序 python字典排序 sorted List的元素可以是各种东 ...
-
SQLSERVER数据库管理数据库原理
数据库的存储结构: 1.逻辑存储结构:是指数据库有那些性质的信息组成,即一个数据库由若干用户可视的各种数据库对象构成,如:表,视图,索引,存储过程等 2.物理存储结构:表现为存储数据的各类操作系 ...
-
用委托、匿名函数、Lambda的方式输出符合要求的数
最近看了一些博客,对委托和匿名函数和Lambda的方式有了一些更深的理解,在前人的基础上.我也写3个例子 using System; using System.Collections.Generic; ...
-
【原创】leetCodeOj --- Copy List with Random Pointer 解题报告
题目地址: https://oj.leetcode.com/problems/copy-list-with-random-pointer/ 题目内容: A linked list is given s ...
-
Python模块之信号学习(signal)
信号概述 在学习Python前应该学习下Linux下的信号,软中断信号(signal,又简称为信号)用来通知进程发生了异步事件.进程之间可以互相通过系统调用kill发送软中断信号.内核也可以因为内部事 ...
-
(android实战)破解apk
简单的总结几个关键步骤: 一.工具准备:apktool , dex2jar , jd-gui 二.使用dex2jar + jd-gui 得到apk的java源码 1.用解压工具从 apk包中取出 cl ...