.net Ioc 之 Unity 适合刚开始使用
介绍:
首先稍微介绍一下,Unity是微软patterns& practices组用C#实现的轻量级、可扩展的依赖注入容器,可通过代码或xml配置文件来配置对象之间的关系。那么通过一个简单的代码来实现。
测试项目详细
1、新建一个控制台项目叫UnityDemo
2、建立一个接口IProduct,包括一个属性(string ClassName{get;set;}),一个方法(void ShowInfo())
3、建立两个类Milk,Sugar,并且继承IProduct,两个类实现代码如下:
public class Milk : IProduct
{
public string ClassName { get; set; } public void ShowInfo()
{
Console.WriteLine("milk:{0}",ClassName);
}
}
public class Sugar : IProduct
{
public string ClassName { get; set; }
public void ShowInfo()
{
Console.WriteLine("sugar:{0}", ClassName);
}
}
开始测试
1、使用Unity需要引用三个dll,也可以使用Nuget获取

2、前面有提到,使用Unity有两种方式,我们先使用代码来控制
a、新建一个静态方法ContaninerCode,需要引用Microsoft.Practices.Unity代码如下:
static void ContainerCode()
{
//创建Unity实例
IUnityContainer container = new UnityContainer(); //默认注册(无命名)
container.RegisterType<IProduct, Milk>();
//命名注册
container.RegisterType<IProduct, Sugar>("Sugar"); //解析默认对象
IProduct _product = container.Resolve<IProduct>();
_product.ClassName = _product.GetType().ToString();
_product.ShowInfo(); //指定命名解析对象
IProduct _Sugar = container.Resolve<IProduct>("Sugar");
_Sugar.ClassName = _Sugar.GetType().ToString();
_Sugar.ShowInfo(); //获取容器中所有的IProduct注册的已命名对象(不包含默认注册)
IEnumerable<IProduct> classList = container.ResolveAll<IProduct>(); foreach (var item in classList)
{
item.ClassName = item.GetType().ToString();
item.ShowInfo();
}
}
运行结果如下:

3、使用配置文件实现
a、根目录新建Unity.config,属性选择复制到生成目录,配置文件内容如下:
<?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="Iproduct" type="UnityDemo.IProduct,UnityDemo"/>
<add alias="Milk" type="UnityDemo.Milk,UnityDemo"/>
<add alias="Sugar" type="UnityDemo.Sugar,UnityDemo"/>
</aliases> <!--容器-->
<container name="MyContainer">
<!--开始映射关系-->
<register type="Iproduct" mapTo="Milk"></register>
<register type="Iproduct" mapTo="Sugar" name="Sugar"></register> </container>
</unity> </configuration>
b、创建静态方法ContainerCodeForConfig()加载配置文件,需要引用dll,Practices.Unity.Configuration、System.Configuration代码如下:
static void ContainerCodeForConfig()
{
//创建Unity实例
IUnityContainer container = new UnityContainer(); string configFile = "Unity.config";
var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = configFile }; //读取指定config文件
Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None); //获取指定名称的节点
UnityConfigurationSection section = (UnityConfigurationSection)configuration.GetSection("unity");
//获取容器节点
container.LoadConfiguration(section, "MyContainer"); IProduct p = container.Resolve<IProduct>("Sugar");
p.ClassName = p.GetType().ToString();
p.ShowInfo();
}
运行结果如下:

可以看到 我们并没有创建IProduct、Sugar类,但是能调用其方法,这是Ioc 帮我们做的
这是一个很简单的入门。
.net Ioc 之 Unity 适合刚开始使用的更多相关文章
- .Net IOC 之Unity
.Net IOC 之Unity 在码农的世界里,为了应付时常变更的客户需求,增加的架构的客扩展性,减少工作量.IOC诞生了,它是一种可以实现依赖注入和控制对象生命周期的容器.最为一个有节操.有追求的码 ...
- ASP.NET MVC IOC之Unity攻略
ASP.NET MVC IOC之Unity攻略 一.你知道IOC与DI吗? 1.IOC(Inversion of Control )——控制反转 即依赖对象不在被依赖模块的类中直接通过new来获取 先 ...
- IOC容器Unity的使用及独立配置文件Unity.Config
[本段摘录自:IOC容器Unity 使用http://blog.csdn.net/gdjlc/article/details/8695266] 面向接口实现有很多好处,可以提供不同灵活的子类实现,增加 ...
- [IoC容器Unity]第四回:使用范例
1.引言 前面几个章节介绍了Unity的基本使用,主要分为程序和配置文件两种方法的使用,可以参考一下链接, [IoC容器Unity]第一回:Unity预览 [IoC容器Unity]第二回:Lifeti ...
- .net IoC 之 Spring.Net 适合刚开始使用
Spring.Net包括控制反转(IoC) 和面向切面(AOP),这篇文章主要说下IoC方面的入门. 一.首先建立一个MVC项目名称叫SpringDemo,然后用NuGet下载spring(我用的是S ...
- 我心中的核心组件(可插拔的AOP)~第十二回 IoC组件Unity
回到目录 说在前 Ioc组件有很多,之前也介绍过autofac,castle等,今天再来说一下在微软Nlayer DDD架构里使用的unity组件,今天主要说一下依靠注入,如果希望看拦截的用法,可以阅 ...
- 第十六回 IoC组件Unity续~批量动态为Unity添加类型和行为
回到目录 之前的一篇Unity的文章主要是基本的实现,并没有什么特别的地方,使用Unity可以方便的实现应用程序的IoC控制反转,这给我们的应用程序在耦合度上变得高了,同时可测试性加强了,当然,这些的 ...
- IoC组件Unity再续~根据类型字符串动态生产对象
回到目录 这个根据类型字符串动态去生产一个接口的对象,在实现项目中用途很广,这即省去了配置config文件的麻烦,又使用生产对象变更可配置,你完全可以把这种多态持久化到数据库里或者XML文件里,在使用 ...
- IOC使用Unity 实现依赖注入
转自:http://www.cnblogs.com/techborther/archive/2012/01/06/2313498.html http://www.cnblogs.com/xishuai ...
随机推荐
- bzoj 4182
首先很容易看出这是一个树上多重背包问题 设状态$f[i][j]$表示以$i$为根的子树中利用的体积是$j$ 但是题目中有要求:选择的点集必须是一个联通块 这要怎么处理? 点分治! 首先我们利用点分治的 ...
- 重写成员“MySql.Data.Entity.MySqlConnectionFactory.CreateConnection(System.String)”时违反了继承安全性规则。重写方法的安全可访问性必须与所重写方法的安全可访问性匹配。
1,程序中使用加载反射出现下面的问题: 无法加载一个或多个请求的类型.有关更多信息,请检索 LoaderExceptions 属性. 然后把代码改了一下, try { types.AddRange ...
- [JSOI2007]麻将 模拟 BZOJ1028
题目描述 麻将是中国传统的娱乐工具之一.麻将牌的牌可以分为字牌(共有东.南.西.北.中.发.白七种)和序数牌(分为条子.饼子.万子三种花色,每种花色各有一到九的九种牌),每种牌各四张. 在麻将中,通常 ...
- N1 Armbian 安装 OpenMediaVault
前言 接上一篇继续折腾,这次在 N1 上进行一些本地化设置并安装使用 OpenMediaVault 步骤 使用 ssh 连接到 N1,修改系统源 cd /etc/apt cp sources.list ...
- 校园网络安全CTF 第一题 和 你真了解我吗?
第一题: 需要先找到相应头(REsponse header中的tips) <?php$flag = "***";if (isset($_GET['repo']))//检测变量 ...
- C++_异常7-exception类
C++异常的主要目的是为了设计容错程序提供语言级支持. 即异常使得在程序设计中包含错误处理功能更加容易,以免事后采取一些严格的错误处理方式. 异常的灵活性和相对方便性激励着程序员在条件允许的情况下在程 ...
- ui-grid 中cellTemplate中click事件
cellTemplate中使用的函数: 外部定义的函数:
- Loj 6433. 「PKUSC2018」最大前缀和 (状压dp)
题面 Loj 题解 感觉挺难的啊- 状压\(dp\) 首先,有一个性质 对于一个序列的最大前缀和\(\sum_{i=1}^{p} A[i]\) 显然对于每个\(\sum_{i=p+1}^{x}A[i] ...
- 洛谷 P3695 CYaRon!语 题解 【模拟】【字符串】
大模拟好啊! 万一远古计算机让我写个解释器还真是得爆零了呢. 题目背景 「千歌です」(我是千歌).「曜です」(我是曜).「ルビィです」(我是露比).「3人合わせて.We are CYaRon! よろし ...
- tensorflow基础-placeholder
placeholder: 要给节点输入数据时用 placeholder,在 TensorFlow 中用placeholder 来描述等待输入的节点,只需要指定类型即可,然后在执行节点的时候用一个字典来 ...