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(); } } }