WebApi通過IOC注入實現AOP

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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章