关于读取Unity 配置的方案

Unity 是常用的Ioc 工具

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

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

 

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

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

 

namespace SSHConsole
{
    public interface ILogger
    {
        void Logging();
    }

    public class SpecialLogger : ILogger
    {
        public void Logging()
        {
            Console.WriteLine("SpecialLogger.Logging");
        }
    }
    public class CommonLogger : ILogger
    {
        public void Logging()
        {
            Console.WriteLine("CommonLogger.Logging");

        }
    }
}

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

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

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/>
    </configSections>


    <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
        
        <container>
            <register type="SSHConsole.ILogger,SSHConsole" mapTo="SSHConsole.SpecialLogger,SSHConsole"/>
        </container>
    </unity>
</configuration>


其中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 节点也可以写成:

    <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
        <alias alias="ILogger" type="SSHConsole.ILogger,SSHConsole" />
        <namespace name="SSHConsole"/>
        <assembly name="SSHConsole" />

        <container>
            <register type="ILogger" mapTo="SpecialLogger"/>
        </container>
    </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/archive/2010/11/12/1875497.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值