微软依赖注入Unity

Unity是一个依赖注入(Dependency Injection,DI)容器。DI的标准描述文章来自Martin Flower[0]。作为一个快速的摘要,依赖注入容器就是一个用于构建高度松耦合的软件的工具。依赖注入容器处理相互关 联对象的所有细节,因此你可以构建一个独立的组件

关于依赖注入这是百科的解释:http://baike.baidu.com/view/1800021.htm

这是unity的地址:http://unity.codeplex.com/
下载最新的是2.1版本,http://www.microsoft.com/download/en/details.aspx?id=17866
下载是msi文件,安装后有bin文件夹和源代码和几个实例项目

打开vs,新建项目,添加Microsoft.Practices.Unity.dll的引用,就可以使用依赖注入了

1.准备接口和类
    public interface ILog
    {
        void Write(string message);
    }

    public class TextFileLogger : ILog
    {
        public void Write(string message)
        {
            Console.WriteLine("Text File Write" + message);
        }
    }

    public class DatabaseLogger : ILog
    {
        public void Write(string message)
        {
            Console.WriteLine("Database Write" + message);
        }
    }

通过代码方式进行依赖注入
2.在  static void Main(string[] args)方法中创建容器。
容器可以注册接口和返回接口,是依赖注入的核心。

简单步骤,1创建容器,2注册接口映射,3获取实例

//容器
            IUnityContainer parentContainer = new UnityContainer();
            //父容器可以创建子容器
            //IUnityContainer chileContainer = parentContainer.CreateChildContainer();
            //默认对象
            parentContainer.RegisterType <ILog, UnityDI.TextFileLogger>();
            //给datalogger在容器中起个名字,以后根据名字得到databaselogger
            parentContainer.RegisterType<ILog, UnityDI.DatabaseLogger>("database");

            //没有参数取默认
            ILog textLog = parentContainer.Resolve<ILog>();
            textLog.Write("aaaaaaaaaaa");
            //根据名字去
            ILog dataLog = parentContainer.Resolve<ILog>("database");
            dataLog.Write("aaaaaaaaaaa");

            //遍历输出已注册的ILogger接口对象,默认参数不会输出
            foreach (object mapping in parentContainer.ResolveAll<ILog>())
            {
                Console.WriteLine(mapping.GetType());
            }

根据配置文件方式进入依赖注入
在config文件中的
配置  <configSections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/>
  </configSections>
(注意configSections这个节点必须configuration下的第一个节点)

然后

  <unity>
    <typeAliases>
      <!--三个不同类型的生命周期-->
      <typeAlias alias="singleton"
                 type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager, Microsoft.Practices.Unity" />
      <typeAlias alias="external"
                 type="Microsoft.Practices.Unity.ExternallyControlledLifetimeManager, Microsoft.Practices.Unity" />
      <typeAlias alias="perThread"
                 type="Microsoft.Practices.Unity.PerThreadLifetimeManager, Microsoft.Practices.Unity" />
      
      <!--给类注册别名,以后直接使用别名就可以代替具体类,type=类的详细命名空间和类名词,然后逗号后面是程序集名词-->
      <typeAlias alias="DatabaseLogger" type="ConsoleApplication1.UnityDI.DatabaseLogger, ConsoleApplication1" />
      <typeAlias alias="TextFileLogger" type=" ConsoleApplication1.UnityDI.TextFileLogger,  ConsoleApplication1" />
      <typeAlias alias="ILogger" type=" ConsoleApplication1.UnityDI.ILog,  ConsoleApplication1" />
    </typeAliases>
    <containers>
      <container>
        <types>
          <!--type是接口,mapto是目标实例化对象-->
          <type type="ILogger" mapTo="DatabaseLogger" >
            <lifetime type="singleton" />
          </type>
         
        </types>
      </container>
    </containers>
  </unity>
使用的时候注意添加Microsoft.Practices.Unity.Configuration.dll
然后通过代码这样就可以使用。通过配置文件中mapto的不同,实例化不同的接口对象
  IUnityContainer container = new UnityContainer();
            
            UnityConfigurationSection config = ConfigurationManager.GetSection("unity") as UnityConfigurationSection;
            config.Configure(container);

            ILog defaultLogger = container.Resolve<ILog>();
            defaultLogger.Write(" hello Unity!");

微软企业库5.0的手册中有关于unity的文档,其他地方好像真找不到
http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=6932

其他msdn资料http://msdn.microsoft.com/en-us/library/ff660923%28v=PandP.20%29.aspx

本人新浪微博:http://weibo.com/i/1741159542

时间: 2024-05-21 21:29:30

微软依赖注入Unity的相关文章

微软名为Unity的依赖注入Application Block

微软模式与实践小组发布了叫做Unity或者Unity Application Block的依赖注入容器.开发人员现在能够利用可扩展的轻量级容器创建松耦合应用. InfoQ有机会采访了Unity项目的开发领头人Chris Tavares. Rob Bazinet (RB): Chris介绍一下你自己和你是如何参与Unity的? Chris Tavares (CT):我的名字叫Chris Tavares.我是微软模式与实践小组的一名高级软件开发人员.我目前正在领导Enterprise Library

深入Unity 1.x依赖注入容器之一:入门

Unity 是由微软开发的一个轻量级.可扩展的依赖注入(Dependency Injection, DI)容器,支持构造函数.属性和方法的依赖注入.所谓依赖的注入,即将程序开发过程中的对象与其所依赖的具体对象解耦,从一定程度上仅关注对所依赖对象的使用,却不管其具体对象是哪个类的实例:而真正的被依赖对象在运行时由容器注入.本质上,它就是一个对象工厂和对象管理器.更详细的信息,请参见<IoC 容器和Dependency Injection 模式>. Unity 适用于可扩展.可插接的应用程序的开发

Entity Framework 实体框架的形成之旅--利用Unity对象依赖注入优化实体框架(2)

在本系列的第一篇随笔<Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)>中介绍了Entity Framework 实体框架的一些基础知识,以及构建了一个简单的基于泛型的仓储模式的框架,例子也呈现了一个实体框架应用的雏形,本篇继续介绍这个主题,继续深化介绍Entity Framework 实体框架的知识,以及持续优化这个仓储模式的实体框架,主要介绍业务逻辑层的构建,以及利用Unity和反射进行动态的对象注册. 1.EDMX文件位置的调整 我们从上篇例子,

Unity(七):使用场景Ⅲ:用于依赖注入(下)

Fluent interface 上一篇文章我使用到了Fluent interface这个特性,但是这一点忘了交代了,不好意思...补上! 先来看段代码: 咋看上去,可能会有些不习惯,但是再仔细看,又会觉得表意很清楚,能够很顺畅的把这段代码阅读下来.这个特性叫做Fluent interface(我还不清楚中文统一的翻译是什么),具体可以参见Martin Fowler的http://martinfowler.com/bliki/FluentInterface.html一文,这个概念也是Martin

Unity(六):使用场景Ⅲ:用于依赖注入(上)

有关依赖注入 什么是依赖注入,我想这个问题我在这里说就不大合适了,所以还是推荐一下大师的文章.之前的文章也提到过,"Martin Fowler的Inversion of Control Containers and the Dependency Injection pattern 是不得不推荐的,当然,如果读起来比较费劲的话,吕震宇的你真的了解Ioc与AOP吗?系列也是不错的参考". 这里要多说一句的是,依赖注入(Dependency Injection)和控制反转(Inversion

使用Unity Application Block(三):理解和使用依赖注入的键

在使用 Unity 创建对象之前,需要准备 Unity 容器,也即进行注册(类型映射).在 使用Unity(二):配置 Unity .读取配置信息和获取对象中, 我们学习了如何使用配置文件来进行注册,而在本文中,我们将学习使用代码来进行各种注册,这些代码所实现的功能同样可以使用配置文件来实现. 因为 Unity 自带的文档已在这方面进行了详细说明,所以在此仅对该文档进行了翻译,以下是译文. Unity 应用程序块容器用键以及可选的名称来标识注册(类型映射).键是接口一个接口或者一个类(通常是基类

深入Unity 1.x依赖注入容器之四:依赖注入

Unity 是一个依赖注入容器,自然依赖注入是它最重要的功能.从以往的讨论来看,矛盾都集中于 Unity 侵入了依赖的对象,这可能是 Unity 在预览版的文档中没有说明,加上某个外国牛人的某篇文章造成的恶果.因为,Unity 同样可以通过配置文件支持非侵入式的依赖注入.本文将从使用 Attribute 和配置文件两个方面对 Unity 的依赖注入的支持进行阐述. Unity 支持构造函数.属性和方法调用注入. 构造函数注入 构造函数注入包含了二种情况,一种是类仅有一个构造函数时,Unity 可

深入Unity 1.x依赖注入容器之三:获取对象

通过前二部分的学习,对象的获取已非常简单,在此对前面用过的对象获取方法进行总结 ,同时对还没有使用过的方法进行补充. Unity 容器中获取对象的方法也包括了泛型方法和对之对应的非泛型重载,在此,仅对泛型方法进行描述. 根据类型获取对象 我们使用方法 Resolve<T>( ) 来根据类型获取对象.这种方法是在前二部分使用最多的,用于获取注册的默认类型映射的对象.示例代码如下所示: 根据类型和名称获取对象 在此使用方法 Resolve<T>(string name) 来根据类型和名

Unity依赖注入--构造器注入

最近准备用Unity来改良系统. 做了一些小测试,拿出来与大家分享一下. 01 using System; 02 using System.Text; 03 using System.Collections.Generic; 04 using System.Linq; 05 using Microsoft.VisualStudio.TestTools.UnitTesting; 06 using Microsoft.Practices.Unity; 07 using System.Diagnost