Unity -- .NET下的原生Ioc框架
摘自:http://www.cnblogs.com/tuyile006/archive/2011/04/07/2008642.html
偶然的机会,发现微软也出品Ioc框架了,属于Microsoft patterns & practices系统的,名字叫Unity(Unity下载地址),考虑可能在手头的项目中会用到,因此下载下来把主要功能做了个测试,感觉马马虎虎,比起Spring好像是挫了点,但是没有办法,很多人有微软洁癖,除了微软的框架其他的用着都觉着不放心,好了,闲话少说,Go!
对了,再废话一句,我不知道Unity的QuickStarts里面怎么净是编程方式下使用Ioc,如果是这样使用Ioc,那么看起来微软是不打算提倡“非侵入式”这个概念了,唉,搞不懂的Microsoft... 又说废话了,本文将介绍如何配置文件方式使用Unity,因为E文太差,Unity的文档只读了一知半解,如果在例子中有错误,请指正。
一.下载Unity,安装...
二.在项目中添加Microsoft.Practices.Unity.dll和Microsoft.Practices.Unity.Configuration.dll的引用。
三.Windows和Console项目请添加App.config文件,Web项目嘛就使用web.config好了,本例将采用Console项目(据说高手都喜欢使用Console,咱不是高手,装一下,嘿嘿~)。
四.使App.config看起来像下面这个样子:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="unity"
type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,
Microsoft.Practices.Unity.Configuration, Version=1.1.0.0,
Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</configSections>
<unity>
<typeAliases>
<typeAlias alias="singleton" type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager,Microsoft.Practices.Unity"/>
<typeAlias alias="ISayHello2" type="Cinlap.Study.UnityDemo.ISayHello2, Cinlap.Study.UnityDemo" />
<typeAlias alias="SayHello2ACloud" type="Cinlap.Study.UnityDemo.SayHello2ACloud,Cinlap.Study.UnityDemo" />
<typeAlias alias="SayHello2Think8848" type="Cinlap.Study.UnityDemo.SayHello2Think8848,Cinlap.Study.UnityDemo" />
<typeAlias alias="ISingletonDemo" type="Cinlap.Study.UnityDemo.ISingletonDemo,Cinlap.Study.UnityDemo" />
<typeAlias alias="SingletonDemoImpl" type="Cinlap.Study.UnityDemo.SingletonDemoImpl,Cinlap.Study.UnityDemo" />
</typeAliases>
<containers>
<container name="containerOne">
<types>
<type type="ISayHello2" mapTo="SayHello2ACloud" name="aCloud"/>
<type type="ISayHello2" mapTo="SayHello2Think8848" name="think8848"/>
<type type="ISingletonDemo" mapTo="SingletonDemoImpl" name="singletonDemoImpl" >
<lifetime type="singleton" />
</type>
</types>
<!--<instances>
</instances>
<extensions>
</extensions>
<extensionConfig>
</extensionConfig>-->
</container>
</containers>
</unity>
</configuration>
这里需要解释点,否则就真的有点糊弄人了。
typeAlias节点是给不太容易识记的类型名起一个别名(似乎有点废话),让一个拥有很我字符的类型名“变”短点。
container节点定义管理依赖关系和生命周期的容器(Ioc容器概念),需要在配置中提供一个名称。
type节点从其mapTo属性就可以看出其用途了,它提供依赖关系和生命周期的具体定义。
插播题外话(关于老生常谈):我们考虑这样一个应用场景:经常在设计评审会义上听R&D说:“我在做设计的时候,本来是想到...,结果考虑到项目时间紧张,我就只能先把XX公司的需求做了,没有考虑通用性的问题...”或者:“我本来以为我们的产品运行(安装)环境(流程)不会发生大的变化,没想到...”,往往这时候Boss就会生那些后果不是很严重的气,但是最终往往也只能把希望寄托于下一版本或下一个项目,但是往往下次再把这个过程重复一遍...
题外话续一(关于架构):CSDN上的一篇文章曾给我留下极其深刻的印象:某位CEO说他们的系统运行了四十多年,而支持这个系统寿命的正是合理的系统架构。这句话让我深思了好久,一种什么架构能使一系统具有如此强大的生命力呢?以前看到的基本上都是系统因运行环境或负载变化而被淘汰,很少听说有系统寿命超过十年的,而这个公司的系统居然可以运行四十年以上!!!深思后得出点浅显的结论,这个公司的系统从一开始就运用了合理的架构,遵循了适时的正确的设计理论,因此,过程很轻易的演化为对象,对象很轻易的又演化为组件,组件又很轻易的演化为服务(也许它就是走了这样一个路线吧)。因此,我暗下决心,不再在我的设计过程加入那些自以为是的假设:不可能跨平台移植、不可能扩展功能、不可能负载增加、不可能...
题外话续二(关于Ioc):有人可能会问,需求发生了变化后我可以重新写代码呀?我有丰富的控(组)件、我有强大的IDE,我针对客户新的需求修改现在的系统用不了多长时间...没错,肯定没错,绝对没错,本文不适合你。也有人可能问,Ioc看起来和Factory没什么区别呀,为什么还要花时间去学习它呢,Factory的确很棒,以前我也曾以掌握Factory模式沾沾自喜,但后来总发现Factory缺点什么,为什么当实例类型变化时还要去打开项目修改源代码呢?又有人说了,你不会使用配置文件么?配置文件?听起来不错,可是...可是如果我要任意的实现Singleton或是指定Instance初始值或是...又怎么办呢?Ioc框架组有人已经偷着笑了,小样,早让你们用我们的产品了吧...
题外话结束。
五.新建一个项目,在里面加入如下几个文件:
ISayHello2.cs
{
string SayHello();
}
SayHello2Think8848.cs
public class SayHello2Think8848 : ISayHello2
{
#region ISayHello2 成员
public string SayHello()
{
return "Hello think8848!";
}
#endregion
}
SayHello2ACloud.cs
public class SayHello2ACloud : ISayHello2
{
#region ISayHello2 成员
public string SayHello()
{
return "Hello aCloud!";
}
#endregion
}
ISingletonDemo.cs
{
DateTime GetInitTime();
}
SingletonDemoImpl.cs
public class SingletonDemoImpl : ISingletonDemo
{
private DateTime time;
public SingletonDemoImpl()
{
this.time = DateTime.Now;
}
#region ISingletonDemo 成员
public DateTime GetInitTime()
{
return this.time;
}
#endregion
}
六.修改Console的Program.cs文件,使Main方法看起来像下面的样子:
static void Main()
{
UnityContainer myContainer = new UnityContainer();
UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
section.Containers["containerOne"].Configure(myContainer);
ISayHello2 sayHello2aCloud = myContainer.Resolve<ISayHello2>("aCloud");
ISayHello2 sayHello2Think8848 = myContainer.Resolve<ISayHello2>("think8848");
Console.WriteLine(sayHello2aCloud.SayHello());
Console.WriteLine(sayHello2Think8848.SayHello());
Console.WriteLine("");
Console.WriteLine("Singleton Demo");
ISingletonDemo singletonDemo1 = myContainer.Resolve<ISingletonDemo>("singletonDemoImpl");
Console.WriteLine("SingletonDemoImpl1 created: {0},SingletonDemoImpl1.GetInitTime() result is{1}:", new object[]{DateTime.Now.ToString(),singletonDemo1.GetInitTime().ToString()});
Thread.Sleep(1000);
ISingletonDemo singletonDemo2 = myContainer.Resolve<ISingletonDemo>("singletonDemoImpl");
Console.WriteLine("SingletonDemoImpl2 created: {0},SingletonDemoImpl2.GetInitTime() result is{1}:", new object[] { DateTime.Now.ToString(), singletonDemo1.GetInitTime().ToString() });
Console.ReadLine();
}
七.F5一下。
结果:
本文仅示例了Unity最基本的最常用的功能,其他功能待续。
Unity中文资料比较少,今天找到一篇讲配置文件的,有兴趣可以点这里阅读。
转载于:https://www.cnblogs.com/zhuwenlubin/archive/2012/07/23/2605446.html
Unity -- .NET下的原生Ioc框架相关推荐
- .NET Core2.1下采用EFCore比较原生IOC、AspectCore、AutoFac之间的性能
一.前言 ASP.NET Core本身已经集成了一个轻量级的IOC容器,开发者只需要定义好接口后,在Startup.cs的ConfigureServices方法里使用对应生命周期的绑定方法即可,常见方 ...
- Android 进阶 教你打造 Android 中的 IOC 框架 【ViewInject】 (下)
上一篇博客我们已经带大家简单的吹了一下IoC,实现了Activity中View的布局以及控件的注入,如果你不了解,请参考:Android 进阶 教你打造 Android 中的 IOC 框架 [View ...
- .NET领域最为流行的IOC框架之一Autofac
一.前言 Autofac是.NET领域最为流行的IOC框架之一,微软的Orchad开源程序使用的就是Autofac,Nopcommerce开源程序也是用的Autofac. Orchad和Nopcomm ...
- Unity应用架构设计(7)——IoC工厂理念先行
一谈到 『IoC』,有经验的程序员马上会联想到控制反转,将创建对象的责任反转给工厂.IoC是依赖注入 『DI』 的核心,大名鼎鼎的Spring框架就是一个非常卓越的的控制反转.依赖注入框架.遗憾的是, ...
- 教你打造 Android 中的 IOC 框架
1.概述 首先我们来吹吹牛,什么叫IoC,控制反转(Inversion of Control,英文缩写为IoC),什么意思呢? 就是你一个类里面需要用到很多个成员变量,传统的写法,你要用这些成员变量, ...
- Android 进阶 教你打造 Android 中的 IOC 框架 【ViewInject】 (上)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39269193,本文出自:[张鸿洋的博客] 1.概述 首先我们来吹吹牛,什么叫Io ...
- spring根据名称获取bean_带你从零开始手写 spring ioc 框架,深入学习 spring 源码
IoC Ioc 是一款 spring ioc 核心功能简化实现版本,便于学习和理解原理. 创作目的 使用 spring 很长时间,对于 spring 使用非常频繁,实际上对于源码一直没有静下心来学习过 ...
- Quarkus:一个Kubernetes原生Java框架
Red Hat发布了Quarkus,这是一个为GraalVM和OpenJDK HotSpot量身定制的Kubernetes原生Java框架.Quarkus的目标是使Java成为Kubernetes和无 ...
- 使用iOS原生sqlite3框架对sqlite数据库进行操作
摘要: iOS中sqlite3框架可以很好的对sqlite数据库进行支持,通过面向对象的封装,可以更易于开发者使用. 使用iOS原生sqlite3框架对sqlite数据库进行操作 一.引言 sqlit ...
最新文章
- python画树叶-用python画树叶
- python大一考试_python 考试补缺
- php ora-12154,ORA-12154 和 TNS-03505 监听错误的解决方法
- grafana zabbix 模板_【Grafana教程】安装Grafana并配置Zabbix数据源
- C#创建单链表,翻转单链表
- c语言程序设计5pdf,C语言程序设计5.pdf
- JSLIU 的 wxWindows 入门
- Spring Boot整合ehcache的详细使用
- Gradle教程——(二)Gradle介绍
- C64+系列DSP的总结
- clion ros debug clion配置ros环境及调试
- 【史玉柱自述:我的营销心得】-成功的牛人其实都有许多你不知道的技能
- ctfshow(菜狗杯)
- 注册快手提示服务器繁忙,快手登录失败怎么回事
- golang内幕之协程状态切换
- CodeIgniter 源码解读之模型
- c++封装so库,供安卓android调用
- 去掉数组中重复出现元素的算法
- 【转载】磁盘空间引起ES集群shard unassigned的处理过程
- SCSI协议及大容量存储命令详解
热门文章
- mysql 客户端乱码_Mysql客户端中文乱码问题解决
- go 递归tree关系_Go实现一个二叉搜索树
- cherokee php,CentOS安装最快Web服务器Cherokee+MySQL+PHP
- 用计算机用图解法求理论塔板数,用Excel图解法求精馏塔理论塔板数.pdf
- android8.0自适应图标,适配8.0+的自适应图标
- SpringSecurity Basic Authentication
- 2.1 Mini-batch 梯度下降法
- opencv 轮廓特征
- Excel Txt 字符集设置
- C语言scanf函数详解和示例