关于读取Unity 配置的方案

Unity 是常用的Ioc 工具

一般情况下用一个 xml来对Unity 进行配置

常见方案有两种,一种是将配置写入到app.config/web.config

 

我们假设现有接口 ILogger   实现此接口的类分别为SpecialLogger 和CommonLogger 对象

假设我们的工程项目叫做SSHConsole (生成的assembly 也是 SSHConsole.dll)

 


此时为了解耦我们应用程序中同时引用ILogger和它的实现类,

我们将此耦合写入配置文件(app.config/web.config)中


其中configSections中的section name = “unity” 为对Unity 的引用(必备)

 

之后unity 节点包含了一个默认的container,用于存放Ioc的关系

里面可以包含多个register

这里的register 中指定了来自于assembly为SSHConsole(来自于SSHConsole.dll) SSHConsole.ILogger 这个接口/类,映射到 来自于assembly为SSHConsole(来自于SSHConsole.dll) SSHConsole.SpecialLogger

 

这里有一个地方需要注意,为什么我们需要如此详细的写出这个type 和mapTo,这是因为配置文件是独立于项目的,它不知道项目中的任何细节,所以你必须要在这里告诉它这个是来自于哪个Dll 的那个namespace的那个类,这样,它才能明确的知道(信息将用于反射生成对象)。

 

之后如果有大量的register 需要写的话,我们也有简便的方法,就是直接告诉unity 在哪些dll,以及哪个namespace 下  搜索,甚至可以命名一个别名,直接代替复杂的字符串。

比如上面的例子的unity 节点也可以写成:


之后在Program 里调用的话,十分简单

 

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

using System.Data.OleDb;

using System.Data;

using System.Configuration;

using Microsoft.Practices.Unity;

using Microsoft.Practices.Unity.Configuration;

namespace SSHConsole

{

    class Program

    {

        static void Main(string[] args)

        {

            //此处需要手动引用Microsoft.Practices.Unity.Configuration,才能使用LoadConfiguration扩展方法



            IUnityContainer container = new UnityContainer().LoadConfiguration();

            //获得默认Container容器,从web.config/app.config 配置文件中





            var obj = container.Resolve<ILogger>();

            //此处解除了实际对象和Program的耦合关系,Program 不需要再引用SpecialLogger

            

            obj.Logging();

            Console.ReadLine();

        }

    }

}

你可能感兴趣的:(unity)