Enterprise Library 4.0中的依赖注入容器(Unity)预览

概述

之前我曾发过一篇Enterprise Library 4.0开发计划中提到微软在Enterprise Library 4.0将加入依赖注入容器,暂定名为DIAB,现在微软终于给它起了个正式的名字Unity,难道是“团结”的意思?:),在Unity最终将以两种形式发布:独立的容器组件和作为Enterprise Library 4.0的一部分,用微软的话说“它是一个轻量级的、可扩展的依赖注入容器”,在ASP.NET MVC Framework推出后引起了业界极大的讨论“MS MVC框架漩涡中的MonoRail未来”,不知道Unity推出之后会不会再出现一场“Unity漩涡中的Castle Windsor未来”或者“Unity漩涡中的Spring.Net未来”的讨论。这里先带您提前预览一下Unity。

Unity预览

在Unity中将提供Register方法来注册对象映射,使用Get方法获得对象的实例,基本API如下:

public class UnityContainer : IDisposable
{
    // getting objects
    public T Get<T>(string key) { }

    public IEnumerable<T> GetAll<T>() { }

    // type mapping
    public UnityContainer Register<TFrom, TTo>(string key) where TTo : TFrom { }

    // singleton support
    public UnityContainer SetSingleton<T>(string key) { }

    // support for registering existing objects
    public UnityContainer RegisterInstance<T>(T existing, string key, bool overload) { }

    // running existing objects through the container
    public T BuildUp<T>(T existing, string key) { }
}

典型使用

在Unity中,我们可以像如下代码这样加入组件:

UnityContainer container = new UnityContainer()
              .Register<ILogger, TraceLogger>()
              .Register<ISomething, Something>();
获取对象实例:
ISomething some = container.Get<ISomething>();

用过Castle的朋友一定还记得,这似乎和Castle中的IOC容器非常像,在Castle的IOC容器中加入组件:

IWindsorContainer container = new WindsorContainer( new XmlInterpreter("http://www.cnblogs.com/BasicUsage.xml") );

container.AddComponent( "txtLog", typeof(ILog), typeof(TextFileLog) );

container.AddComponent( "format", typeof(ILogFormatter), typeof(TextFormatter) );

获取对象实例:

ILog log = (ILog)container["txtLog"];

二者是不是有几分相似呢?不知道Unity会给我们带来哪些惊喜?

结束语

在ASP.NET MVC Framework推出后引起了业界极大的讨论“MS MVC框架漩涡中的MonoRail未来”,不知道Unity推出之后会不会再出现一场“Unity漩涡中的Castle Windsor未来”或者“Unity漩涡中的Spring.Net未来”的讨论。不管怎么说,微软推出Unity,我们又多了一种可供选择的依赖注入容器。
参考:DIAB is now Unity

posted @ 2008-01-16 00:09 TerryLee 阅读(...) 评论(...) 编辑 收藏