1、封装IOC注入工具库:WebApi.Util.Unity;
引用Unity相关Nuget包:主要以下五个:
(1)封装Unity工厂类,初始化Unity容器
using Microsoft.Practices.Unity.Configuration;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Unity;
namespace WebApi.Util.Unity
{
public class UnityContainerFactory
{
private static IUnityContainer _container = null;
public static IUnityContainer BuildContainer()
{
return _container;
}
static UnityContainerFactory()
{
ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "Config\\Unity.config");//找到配置文件
Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
UnityConfigurationSection section = (UnityConfigurationSection)configuration.GetSection(UnityConfigurationSection.SectionName);
_container = new UnityContainer();
section.Configure(_container, "WebApiContainer");
}
}
}
2、创建WebApi应用程序:也需要引用Unity相关Nuget包,
(1)在根目录下创建文件Config文件夹,创建Unity.config文件,可根据需要自由配置
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Unity.Configuration"/>
</configSections>
<unity>
<sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Unity.Interception.Configuration"/>
<containers>
<container name="WebApiContainer">
<extension type="Interception"/>
<register type="WebApi.Interface.IUserService,WebApi.Interface" mapTo="WebApi.Service.UserService, WebApi.Service">
<interceptor type="InterfaceInterceptor"/>
<interceptionBehavior type="WebApi.Util.Unity.UnityWay.LogBeforeBehavior,WebApi.Util.Unity"/>
<interceptionBehavior type="WebApi.Util.Unity.UnityWay.LogAfterBehavior, WebApi.Util.Unity"/>
</register>
</container>
</containers>
</unity>
</configuration>
(2)在WebApi.Util.Unity工具库中,创建LogBeforeBehavior、LogAfterBehavior两个需要AOP注入方法的类,也可根据功能需求自由配置,但是一定主要需要继承IInterceptionBehavior
public class LogBeforeBehavior : IInterceptionBehavior
{
public IEnumerable<Type> GetRequiredInterfaces()
{
return Type.EmptyTypes;
}
public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
{
Console.WriteLine($"LogBeforeBehavior");
return getNext().Invoke(input, getNext);
}
public bool WillExecute
{
get { return true; }
}
}
public class LogAfterBehavior : IInterceptionBehavior
{
public bool WillExecute
{
get { return true; }
}
public IEnumerable<Type> GetRequiredInterfaces()
{
return Type.EmptyTypes;
}
public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
{
Console.WriteLine("LogAfterBehavior");
IMethodReturn methodReturn = getNext()(input, getNext);
Console.WriteLine("LogAfterBehavior" + methodReturn.ReturnValue);
return methodReturn;
}
}
(3)封装API控制器注册工具类(继承IDependencyResolver):
public class UnityDependencyResolver : IDependencyResolver
{
private IUnityContainer _UnityContainer = null;
public UnityDependencyResolver(IUnityContainer container)
{
_UnityContainer = container;
}
public IDependencyScope BeginScope()
{
return new UnityDependencyResolver(this._UnityContainer.CreateChildContainer());
}
public void Dispose()
{
this._UnityContainer.Dispose();
}
public object GetService(Type serviceType)
{
try
{
string s = serviceType.Name;
return _UnityContainer.Resolve(serviceType);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return null;
}
}
public IEnumerable<object> GetServices(Type serviceType)
{
try
{
return _UnityContainer.ResolveAll(serviceType);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return null;
}
}
}
(4)注册服务
(5)