在WebApi中使用Unity IOC容器,则除了安装

Nuget包之外,还需要三个步骤:(1)依赖包的安装;(2)创建UnityContainerFactory和unity.config配置文件;  (3)实现IDependencyResolver接口并注册到WebApi应用中。

一、获取NUGet包

如下图所示,直接安装Unity,当前最新版本5.11.7,此外还需要安装Unity.Configuration包。如果需要AOP功能的,把Unity.Interception也一起安装。

unity的配置表_unity的配置表

unity的配置表_配置文件_02

二、创建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是自定义的,可以自定义为任何文件夹。文件属性的“复制到输出目录”要选择始终复制。

unity的配置表_unity的配置表_03

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的配置表_自定义_04

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>

unity的配置表_自定义_05

三、实现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的代码(红色框内)如下:

unity的配置表_App_06

3.2 方式二:使用Unity.WebApi库

首先下载Unity.WebApi库。

unity的配置表_unity的配置表_07

该库下载后,会在项目的App_Start文件夹中生成一个UnityConfig.cs文件。

unity的配置表_配置文件_08

自动生成的UnityConfig.cs 的文件内容如下:

unity的配置表_配置文件_09

可以看到,和方式一相比,就是Unity.WebApi库创建了UnityDependencyResolver类,该类实现了IDependencyResolver接口。因此,Unity.WebApi库主要是实现IDependencyResolver接口,并且在通过NUGet下载是自动帮助生成了UnityConfig类。

完了完成注册,还需要两个步骤:

(1)在Global.asax中调用UnityConfig.RegisterComponents(),如下图所示:

unity的配置表_unity的配置表_10

(2)在UnityConfig.cs文件中,修改并完成Unity的配置。修改后的UnityConfig类如下:

unity的配置表_App_11