在WebApi中使用Unity IOC容器,则除了安装
Nuget包之外,还需要三个步骤:(1)依赖包的安装;(2)创建UnityContainerFactory和unity.config配置文件; (3)实现IDependencyResolver接口并注册到WebApi应用中。
一、获取NUGet包
如下图所示,直接安装Unity,当前最新版本5.11.7,此外还需要安装Unity.Configuration包。如果需要AOP功能的,把Unity.Interception也一起安装。
二、创建UnityContainerFactory和unity.config配置文件
UnityContainerFactory作为提供容器的工厂类,需要将容器作为单例类来管理。以下用两种方式实现该功能,任选一种即可。
2.1 方式一:
public class UnityContainerFactory
{
private static IUnityContainer _unityContainer = null;
static UnityContainerFactory()
{
//创建私有静态变量UnityContainer
_unityContainer = new UnityContainer();
//根据cfg文件,创建configuration对象实例
ExeConfigurationFileMap myFileMap = new ExeConfigurationFileMap()
{
ExeConfigFilename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "cfgs\\unity.config")
};
Configuration configuration =
ConfigurationManager.OpenMappedExeConfiguration(myFileMap, ConfigurationUserLevel.None);
//获取UnityConfigurationSection对象的实例
UnityConfigurationSection unitySection =
(UnityConfigurationSection)configuration.GetSection("unity");
//利用UnityConfiguraitonSection对容器进行初始化,其中rootContainer是configuration文件中自定义的容器名
unitySection.Configure(_unityContainer, "rootContainer");
}
public static IUnityContainer GetContainer()
{
return _unityContainer;
}
}
unity.config文件:(特别要注意,section的名字不要写错了,否则会出错)
<configuration>
<configSections>
<!--一定要注意section单词不要拼写错误,否则在调用GetSection(“unity”)方法
时不会返回正确的对象,无法强制转换为UnityConfigurationSection实例对象-->
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,
Unity.Configuration"/>
</configSections>
<unity>
<containers>
<container name="rootContainer">
<register type="WebApiPractice.BLLInterface.IUserService,WebApiPractice"
mapTo="WebApiPractice.BLL.UserService,WebApiPractice"/>
<register type="WebApiPractice.BLLInterface.IBroadcast,Service,WebApiPractice"
mapTo="WebApiPractice.BLL.BroadCastService,WebApiPractice"/>
<!--更多的注册-->
</container>
</containers>
</unity>
</configuration>
unity.config文件可以放在cfgs文件夹中,当然cfgs是自定义的,可以自定义为任何文件夹。文件属性的“复制到输出目录”要选择始终复制。
2.2 方式二:
public class UnityContainerFactory
{
private static IUnityContainer _unityContainer = null;
static UnityContainerFactory()
{
//创建私有静态变量UnityContainer
_unityContainer = new UnityContainer();
//利用ConfigurationManager获取UnityConfigurationSection对象的实例
UnityConfigurationSection unitySection =
(UnityConfigurationSection)ConfigurationManager.GetSection("unity");
//利用UnityConfiguraitonSection对容器进行初始化,其中rootContainer是configuration文件中自定义的容器名
unitySection.Configure(_unityContainer, "rootContainer");
}
public static IUnityContainer GetContainer()
{
return _unityContainer;
}
}
unity.config文件中的内容如下(注:unity.config文件与web.config放在同一个目录中)。可以看到,该配置文件与方式一中的配置文件相比,configSections的内容已经转移到了web.config中,根元素直接从unity开始。
<unity>
<containers>
<container name="rootContainer">
<register type="WebApiPractice.BLLInterface.IUserService,WebApiPractice"
mapTo="WebApiPractice.BLL.IUserService,WebApiPractice"/>
<register type="WebApiPractice.BLLInterface.IBroadcastService,WebApiPractice"
mapTo="WebApiPractice.BLL.BrocastService,WebApiPractice"/>
</container>
</containers>
</unity>
三、实现IDependencyResolver接口并注册
有两种方式,一种是手工实现IDependencyResolver并注册,第二种是直接使用Unity.WebApi库(更为简单,推荐使用第二中)。实际上两种方式本质是一样的,就是第一种是手工去实现IDependencyResolver,而第二种是使用实现该接口的类库。
3.1 方式一:手工实现并注册
如下所示,创建UnityDependencyResolver类,该类实现了IDependencyResolver接口。
public class UnityDependencyResolver : IDependencyResolver
{
private IUnityContainer _IUnityContainer= null;
public UnityDependencyResolver(IUnityContainer container)
{
this._IUnityContainer =container;
}
public IDependencyScope BeginScope()
{
var child = _IUnityContainer.CreateChildContainer();
return new UnityDependencyResolver(child);
}
public void Dispose()
{
_IUnityContainer.Dispose();
}
public object GetService(Type serviceType)
{
try
{
return _IUnityContainer.Resolve(serviceType);
}
catch(ResolutionFailedException)
{
return null;
}
}
public IEnumerable<object> GetServices(Type serviceType)
{
try
{
return _IUnityContainer.ResolveAll(serviceType);
}
catch (ResolutionFailedException)
{
return new List<object>();
}
}
}
注册:在App_Start目录中的WebApiConfig.cs文件中,增加配置UnityContainer的代码(红色框内)如下:
3.2 方式二:使用Unity.WebApi库
首先下载Unity.WebApi库。
该库下载后,会在项目的App_Start文件夹中生成一个UnityConfig.cs文件。
自动生成的UnityConfig.cs 的文件内容如下:
可以看到,和方式一相比,就是Unity.WebApi库创建了UnityDependencyResolver类,该类实现了IDependencyResolver接口。因此,Unity.WebApi库主要是实现IDependencyResolver接口,并且在通过NUGet下载是自动帮助生成了UnityConfig类。
完了完成注册,还需要两个步骤:
(1)在Global.asax中调用UnityConfig.RegisterComponents(),如下图所示:
(2)在UnityConfig.cs文件中,修改并完成Unity的配置。修改后的UnityConfig类如下: