测试代码链接
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;
}
}
}