20180703Advanced11Course26AOP

一、.net  Unity版本

Unity:5.8.6
Unity.Abstractions:3.3.0
Unity.Interception:5.5.3

.net Framework 4.7.2

二、该版本对应的配置文件 

<?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="aopContainer">
                <extension type="Interception"/>
                <register type="UnityProject.UnityWay.IUserProcessor,UnityProject" mapTo="UnityProject.UnityWay.UserProcessor,UnityProject">
                    <interceptor type="InterfaceInterceptor"/>
                    <interceptionBehavior type="UnityProject.UnityWay.ExceptionLoggingBehavior, UnityProject"/>
                    <interceptionBehavior type="UnityProject.UnityWay.CachingBehavior, UnityProject"/>
                    <interceptionBehavior type="UnityProject.UnityWay.LogBeforeBehavior, UnityProject"/>
                    <interceptionBehavior type="UnityProject.UnityWay.ParameterCheckBehavior, UnityProject"/>
                    <interceptionBehavior type="UnityProject.UnityWay.LogAfterBehavior, UnityProject"/>
                </register>
            </container>
        </containers>
    </unity>
</configuration>
View Code

 三、.net Core Unity版本

1、System.Configuration.ConfigurationManager 5.0.0

2、Unity 5.11.7

3、Unity.Abstractions 5.11.6

4、Unity.Configuraion 5.11.2

5、Unity.Interception 5.11.1

四、.net 对应的配置文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<configSections>
		<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Unity.Configuration"/>
	</configSections>
	<unity>
		<typeAliases>
			<typeAlias alias="IPhone" type="UnityProject.UnityWay.IUserProcessor,UnityProject" />
			<typeAlias alias="NubiaPhone" type="UnityProject.UnityWay.UserProcessor,UnityProject" />
		</typeAliases>
		<containers>
			<container name="IOCcontainer">
				<types>
					<type type="IPhone" mapTo="NubiaPhone"></type >
					
				</types>
				
			</container>
		</containers>
	</unity>
</configuration>

  

五、AOP使用

using System;
using System.Collections.Generic;
using Unity.Interception.InterceptionBehaviors;
using Unity.Interception.PolicyInjection.Pipeline;

namespace UnityProject.UnityWay
{
    /// <summary>
    /// 不需要特性
    /// </summary>
    public class CachingBehavior : IInterceptionBehavior
    {
        public IEnumerable<Type> GetRequiredInterfaces()
        {
            return Type.EmptyTypes;
        }

        private static Dictionary<string, object> CachingBehaviorDictionary = new Dictionary<string, object>();

        public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
        {
            Console.WriteLine("CachingBehavior");
            string key = $"{input.MethodBase.Name}_{Newtonsoft.Json.JsonConvert.SerializeObject(input.Inputs)}";
            if (CachingBehaviorDictionary.ContainsKey(key))
            {
                return input.CreateMethodReturn(CachingBehaviorDictionary[key]);//直接返还  断路器  不再往下
            }
            else
            {
                IMethodReturn result = getNext().Invoke(input, getNext);
                if (result.ReturnValue != null)
                    CachingBehaviorDictionary.Add(key, result.ReturnValue);
                return result;
            }


        }

        public bool WillExecute
        {
            get { return true; }
        }
    }
}

  

六、接口

namespace UnityProject.UnityWay
{
    public interface IUserProcessor
    {
        void RegUser(User user);
        User GetUser(User user);
    }
}

七、类

using System;

namespace UnityProject.UnityWay
{
    public class UserProcessor : IUserProcessor
    {
        public void RegUser(User user)
        {
            Console.WriteLine("用户已注册。");
            //throw new Exception("11");
        }
        [Obsolete]
        public User GetUser(User user)
        {
            return user;
        }
    }
}

八、动态代理

    /// <summary>
    /// 使用EntLibPIAB Unity 实现动态代理
    /// 
    /// </summary>
    public class UnityConfigAOP
    {
        public static void Show()
        {
            User user = new User()
            {
                Name = "Eleven",
                Password = "12345678934534643"
            };
            {
                IUnityContainer container = new UnityContainer();
                container.RegisterType<IUserProcessor, UserProcessor>();
                IUserProcessor processor = container.Resolve<IUserProcessor>();
                processor.RegUser(user);
            }
            {
                //配置UnityContainer
                IUnityContainer container = new UnityContainer();
                ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
                fileMap.ExeConfigFilename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "CfgFiles\App.Config");
                Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
                UnityConfigurationSection configSection = (UnityConfigurationSection)configuration.GetSection(UnityConfigurationSection.SectionName);
                configSection.Configure(container, "IOCcontainer");

                IUserProcessor processor = container.Resolve<IUserProcessor>();
                processor.RegUser(user);
                User userNew1 = processor.GetUser(user);
                User userNew2 = processor.GetUser(user);
            }
        }
    }

九、实体

namespace UnityProject
{
    public class User
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Password { get; set; }
    }
}

  

原文地址:https://www.cnblogs.com/lanyuejiagou/p/14003183.html