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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值