WebAPI笔记:在WebApi使用IOC

测试代码链接
IOC是怎么跟WebApi结合
1 UnityDependencyResolver 实现一个IDependencyResolver,里面用自己的容器UnityContainerFactory;把webapi的DependencyResolver换成自己的Unity版本的
2 启动时config.DependencyResolver=自定义的;在WebApiConfig.Register中注册容器。config.DependencyResolver = new UnityDependencyResolver(UnityContainerFactory.GetContainer());

在控制器构造函数传入容器对象接口参数,可以利用容器自动构造注入。DI 依赖注入

AOP:面向切面编程,可以在不破坏封装的前提下,去增加了权限认证功能
权限认证:可以在方法执行前完成验证
异常处理:可以在方法执行期间出现异常,被处理掉
有局限性:只有控制器实例化后,方法执行完之前,出现的异常才能被抓住
全局异常:控制器实例化/方法错误 ExceptionHandler
actionfilter:可以在action执行前/后分别增加逻辑

注意:配置AOP时比配置DI需要多配置下面两行代码

 <sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Unity.Interception.Configuration"/>
 <extension type="Interception"/>

容器配置信息参考ioc.config配置文件格式如下:

 <?xml version="1.0" encoding="utf-8"?>
<unity>
  <sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Unity.Interception.Configuration"/>
  <containers>
    <container name="IOCcontainer">
      <extension type="Interception"/>
      <register type="ThirdWebApi.Unity.Interface.DbContext,ThirdWebApi" mapTo="ThirdWebApi.Unity.Service.CustomDbContext, ThirdWebApi"/>
      <register type="ThirdWebApi.Unity.Interface.IUserService,ThirdWebApi" mapTo="ThirdWebApi.Unity.Service.UserService, ThirdWebApi">
      <interceptor type="InterfaceInterceptor"/>
          <interceptionBehavior type="ThirdWebApi.Unity.AOP.LogBeforeBehavior, ThirdWebApi"/>
      </register>
    </container>
  </containers>
</unity>

web.config配置在configuration节点中添加

  <configSections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Unity.Configuration"/>
  </configSections>
  <unity configSource="XmlConfig\ioc.config" />

单例容器

using Microsoft.Practices.Unity.Configuration;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Web;
using Unity;

namespace ThirdWebApi.Unity
{
    /// <summary>
    /// UnityContainer单例容器
    /// </summary>
    public class UnityContainerFactory
    {
        private static IUnityContainer _Container = null;

        static UnityContainerFactory()
        {
            Console.WriteLine("*****************UnityContainer*********************");
            {
                //ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
                //fileMap.ExeConfigFilename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "XmlConfig\\ioc.Config");//找配置文件的路径
                //Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
                //UnityConfigurationSection section = (UnityConfigurationSection)configuration.GetSection(UnityConfigurationSection.SectionName);
                //_Container = new UnityContainer();
                //section.Configure(_Container, "IOCcontainer");

                _Container = new UnityContainer();
                UnityConfigurationSection configSection = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
                configSection.Configure(_Container, "IOCcontainer");
            }
        }

        //获取容器实例
        public static IUnityContainer GetContainer()
        {
            return _Container;
        }
    }
}

实现IOC与WebApi结合
UnityDependencyResolver 实现一个IDependencyResolver,里面包装自己的Unity容器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http.Dependencies;
using Unity;
using Unity.Exceptions;

namespace ThirdWebApi.Unity
{

    //实现IOC与WebApi结合
    //UnityDependencyResolver 实现一个IDependencyResolver,里面包装自己的Unity容器UnityContainerFactory
    //把webapi的DependencyResolver换成自己的Unity版本的
    public class UnityDependencyResolver : IDependencyResolver
    {
        private IUnityContainer _IUnityContainer = null;
        public UnityDependencyResolver(IUnityContainer unityContainer)
        {
            this._IUnityContainer = unityContainer;
        }

        /// <summary>
        /// 获取单个服务
        /// </summary>
        /// <param name="serviceType"></param>
        /// <returns></returns>
        public object GetService(Type serviceType)
        {
            try
            {
                return this._IUnityContainer.Resolve(serviceType);
            }
            catch (ResolutionFailedException ex)//因为会累计构造多个对象,很多是没有去扩展,直接null就行
            {
                return null;
            }
        }

        public IEnumerable<object> GetServices(Type serviceType)
        {
            try
            {
                return this._IUnityContainer.ResolveAll(serviceType);
            }
            catch (ResolutionFailedException)
            {
                return new List<object>();
            }
        }

        public IDependencyScope BeginScope()//每次请求
        {
            var child = this._IUnityContainer.CreateChildContainer();
            return new UnityDependencyResolver(child);
        }

        public void Dispose()
        {
            this._IUnityContainer.Dispose();
        }
    }
}

在控制器构造函数传入容器对象接口参数,可以利用容器自动构造注入。DI 依赖注入

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using ThirdWebApi.Models;
using ThirdWebApi.Unity.Interface;

namespace ThirdWebApi.Controllers
{
    public class UsersController : ApiController
    {
        private IUserService _iUserService = null;
        private List<Users> _userList = null;

        public UsersController(IUserService userService)//userService将在ioc中通过配置依赖注入
        {
            this._iUserService = userService;
            this._userList = this._iUserService.GetList();
        }


        [HttpGet]
        public IEnumerable<Users> Get()
        {
            return _userList;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_39827640/article/details/107624207