Unity是一个依赖注入(Dependency Injection。DI)容器。DI的标准描写叙述文章来自Martin Flower[0]。

作为一个高速的摘要,依赖注入容器就是一个用于构建高度松耦合的软件的工具。依赖注入容器处理相互关 联对象的全部细节。因此你能够构建一个独立的组件




这是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!");