1、封装IOC注入工具库:WebApi.Util.Unity;

        引用Unity相关Nuget包:主要以下五个:

WebApi通过IOC注入实现AOP

     (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)注册服务WebApi通过IOC注入实现AOP

    (5)

WebApi通过IOC注入实现AOP

相关文章: