关于读取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();
        }
    }
}
原文地址:https://www.cnblogs.com/jicheng1014/p/1875497.html