Unity Ioc在WebApi中的配置方法:方式一

在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类如下:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值