Unity Application Block (Unity) 是微软 Patterns & Practices 团队开发的一个轻量级、可扩展的依赖注入容器,有助于构建松散耦合的系统。它支持构造子注入 (Constructor Injection) , 属性/设值方法注入 (Property/Setter Injection) 和方法调用注入 (Method Call Injection) 。Patterns & Practices 团队于前些天(4月4日)发布了Unity的第一个正式版本(Unity 1.0)。
准备工作
先看一些接口和类,下面会用到:
public interface IPlayer
{
void Play();
}
public class Mp3Player : IPlayer
{
public void Play()
{
Console.WriteLine("Playing Mp3");
}
}
public class CDPlayer : IPlayer
{
public void Play()
{
Console.WriteLine("Playing CD");
}
}
public class DVDPlayer : IPlayer
{
public void Play()
{
Console.WriteLine("Playing DVD");
}
}
{
void Play();
}
public class Mp3Player : IPlayer
{
public void Play()
{
Console.WriteLine("Playing Mp3");
}
}
public class CDPlayer : IPlayer
{
public void Play()
{
Console.WriteLine("Playing CD");
}
}
public class DVDPlayer : IPlayer
{
public void Play()
{
Console.WriteLine("Playing DVD");
}
}
以一个简单的例子开始
//创建Unity容器
IUnityContainer container = new UnityContainer();
//注册类型映射
container.RegisterType<IPlayer, Mp3Player>();
//获取对象实例,由于上一步已在容器中将IPlayer接口映射为Mp3Player类,
//所以这里会自动装载Mp3Player类,创建该类的实例
IPlayer player = container.Resolve<IPlayer>();
//调用实例方法
player.Play();
IUnityContainer container = new UnityContainer();
//注册类型映射
container.RegisterType<IPlayer, Mp3Player>();
//获取对象实例,由于上一步已在容器中将IPlayer接口映射为Mp3Player类,
//所以这里会自动装载Mp3Player类,创建该类的实例
IPlayer player = container.Resolve<IPlayer>();
//调用实例方法
player.Play();
输出为:
注册映射
在Unity中可以通过两种方式来为Container注册映射:
1. RegisterType:
在容器中注册“接口”( 包括 Interface 和 Base Class ) 到“具体类”的映射。在需要的时候 ( 如上例中container.Resolve<IPlayer>() ) ,容器会根据指定的接口创建它所映射的具体类的实例。
如:
//注册IPlay接口映射为Mp3Player类
container.RegisterType<IPlayer, Mp3Player>();
//注册BasePlay基类映射为Mp3Player类
container.RegisterType<BasePlayer, Mp3Player>();
container.RegisterType<IPlayer, Mp3Player>();
//注册BasePlay基类映射为Mp3Player类
container.RegisterType<BasePlayer, Mp3Player>();
一个接口可能会映射多个具体类,可以为每个映射指定Name,如:
container.RegisterType<IPlayer, Mp3Player>("myMp3Player1");
RegisterType有以下几个重载方法:
RegisterType<TFrom, TTo>( )
RegisterType<TFrom, TTo>(LifetimeManager lifetime)
RegisterType<TFrom, TTo>(String name)
RegisterType<TFrom, TTo>(String name, LifetimeManager lifetime)
RegisterType<T>(LifetimeManager lifetime)
RegisterType<T>(String name, LifetimeManager lifetime)
RegisterType(Type from, Type to)
RegisterType(Type from, Type to, String name)
RegisterType(Type from, Type to, LifetimeManager lifetime)
RegisterType(Type from, Type to, String name, LifetimeManager lifetime)
RegisterType(Type t, LifetimeManager lifetime)
RegisterType(Type t, String name, LifetimeManager lifetime)
关于LifttimeManager可以参考下面文章:
Mp3Player mp3Player = new Mp3Player();
//注册IPlayer接口映射为mp3Player实例
container.RegisterInstance<IPlayer>(mp3Player);